reinterpret_cast - 奇怪的行为
reinterpret_cast - bizarre behaviour
我遇到了与reinterpret_cast有关的奇怪错误。只需查看下面的代码:
int* var;
reinterpret_cast<void const **>(&var);
VSC++2010 中的错误:错误 C2440:"reinterpret_cast":无法从"int **"转换为"const void **
"GCC 4.1.2 中的错误:从类型"int**"reinterpret_cast为"const void**"类型会丢弃恒常性
GCC 4.6.2 中的错误:从类型"int**"reinterpret_cast为"const void**"会丢弃限定符
有没有人知道为什么编译器说我正在抛弃 const。我和我的几个同事都不知道它出了什么问题。
感谢您的帮助!
C++03 标准的第 5.2.10 节讨论了reinterpret_cast可以做什么。 它明确指出"reinterpret_cast操作者不得抛弃恒定性"。
抛弃恒常性在 C++03 标准的第 5.2.11 节中定义。 那里使用的符号有点令人困惑,但它基本上指出,如果给定限定没有隐式转换,则在两种类型之间进行转换会"抛弃恒定性"。
在您的情况下,您正在尝试将int **
转换为void const**
。 编译器问"我可以在T **
和T const**
之间隐式转换吗?",答案是否定的,所以它说你正在抛弃恒常性。
这里的逻辑是,reinterpret_cast是为了处理不断变化的类型,而不是改变限定符(这就是const_cast的目的)。 因此,如果你要求它做一些你需要const_cast的事情,它会拒绝。
要添加/删除const
,请使用const_cast
。
要处理令人困惑的转换错误,请一步一步地做一些事情:
int* var;
int** v2 = &var;
int const** v3 = const_cast<int const**>(v2);
void const** v4 = reinterpret_cast<void const**>(v3);
请注意,int const**
和int**
是非常不同的类型,在它们之间进行转换是危险的——比void*
<> int*
更危险。
假设您有一个int** bob
. 然后,将其传递给一个函数,该函数通过const_cast
进行int const** alice
。
在该函数中,他们将一个指针分配给存储在只读存储器中的 int 到*alice
- 完全合法。
在函数外部,您检查bob
和*bob
是否有效,然后分配给**bob
,并且您刚刚尝试写入只读内存。
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- Shared_ptr cast vs static_cast speed
- C++20 中的严格别名规则是否允许标准 c++ unicode 字符和下划线类型之间"reinterpret
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- C++错误,隐 <function-style-cast> 式要求使用模板化类一次调用多个构造函数的多个转换
- 如何修复<function-style-cast>错误:无法从'initializer list'转换为asdending比较<W>(模板函子)
- C++ C++ 中的函数声明,键入 CAST
- static_cast会丢弃错误,但C风格的演员cast有效
- C++ cast char * to unsigned char
- 禁用 Clang 中的"cast from pointer to smaller type uint32_t"错误
- 是否可以使用gcc 3.3版修复与int*cast相关的Sun Solaris OS 5.8分段故障
- C++ const-cast 一个引用