gpt4 book ai didi

c++ - 从 'void *' 转换为 'const std::string *&' 必须使所有中间指针 const 合格

转载 作者:行者123 更新时间:2023-11-30 05:03:53 40 4
gpt4 key购买 nike

我有一段代码,它使用 iostreams 的 xallocpword 将各种类型的标志存储为指针。由于 pword 公开了一个 void*&,我有一个简单的包装器来通过旧的 C 转换公开存储的类型。但是从第 5 版开始,clang 发出了一个我不太理解的警告。我不知道如何避免它。简单的测试用例如下所示:

#include <iostream>
#include <string>

using namespace std::literals;

void*& pword()
{
static void* ptr;
return ptr;
}

const std::string*& sword()
{
return (const std::string*&) pword();
}

int main()
{
const auto s1 = "foo"s;
const auto s2 = "bar"s;
sword() = &s1;
std::cerr << *sword() << '\n';
sword() = &s2;
std::cerr << *sword() << '\n';
}

我收到的警告(似乎忘记了 void* 上的引用):

clang++-mp-devel -std=c++17 -Wcast-qual foo.cc && ./a.out 
foo.cc:14:32: warning: cast from 'void *' to 'const std::string *&' (aka 'const basic_string<char,
char_traits<char>, allocator<char> > *&') must have all intermediate pointers const qualified
to be safe [-Wcast-qual]
return (const std::string*&) pword();
^
1 warning generated.
foo
bar

此外,我看不出如何使用 C++ 强制转换来代替 C 的全能强制转换。明显的尝试:

const std::string*& sword2()
{
return static_cast<const std::string*&>(pword());
}

以我不理解的错误结束。该错误似乎暗示编译器可能觉得有必要在某处插入一个拷贝,从而破坏引用链,但我不明白在哪里以及为什么。

foo.cc:19:10: error: non-const lvalue reference to type 'const std::string *' (aka 'const
basic_string<char, char_traits<char>, allocator<char> > *') cannot bind to a value of
unrelated type 'void *'
return static_cast<const std::string*&>(pword());
^ ~~~~~~~

最佳答案

这相当于一个著名的事实,你不能转换char**const char** ——因为它允许

const char cc='a';
const char *cp=&cc;
char *p;
const char **pp=&p; // error in question
*pp=cp; // i.e., p=&cc;
*p='z'; // oops

在这种情况下,通过描述 void*作为const std::string* ,你可以在那里存储指向常量字符串的指针(就像你做的那样),然后使用 static_castvoid* 上获得非 const指向字符串的指针。

答案是使用const_cast 添加 const然后(正如 HolyBlackCat 所说)reinterpret_cast (然后注意不要尝试修改字符串!):

const std::string*& sword()
{
return reinterpret_cast<const std::string*&>(const_cast<const void*&>(pword()));
}

除了 const-correctness 之外,我现在不记得是否存储了 T*。进入void*通过这样的变量 reinterpret_cast是定义的行为;然而,人们希望它能在常见的实现中发挥作用。

关于c++ - 从 'void *' 转换为 'const std::string *&' 必须使所有中间指针 const 合格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49209981/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com