C ++

我遇到了与reinterpret_cast有关的奇怪错误。 请看下面的代码:

int* var;
reinterpret_cast<void const **>(&var);

VSC ++ 2010错误:错误C2440:'reinterpret_cast':无法从'int **'转换为'const void **'

gcc 4.1.2中的错误:从'int **'类型到类型'const void **'的reinterpret_cast转换为constness

gcc 4.6.2中的错误:从'int **'类型的reinterpret_cast类型为'const void **'转换了限定符

有没有人知道为什么编译器会说我将const强制转移。 我和我的很多同事都不知道它有什么问题。

感谢帮助!


C ++ 03标准的5.2.10节讨论了reinterpret_cast可以做什么。 它明确规定:“reinterpret_cast运算符不得抛弃const。”。

在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 ,并且你试图写入只读内存。

链接地址: http://www.djcxy.com/p/73763.html

上一篇: c++

下一篇: c++