reinterpret_cast - 奇怪的行为

时间:2013-02-01 15:14:51

标签: c++ casting const reinterpret-cast

我遇到了与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 **'的类型转换为constness

gcc中的

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

有没有人知道为什么编译器说我正在施展const。我,我的一些同事都不知道它有什么问题。

感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

C ++ 03标准的第5.2.10节讨论了reinterpret_cast可以做什么。它明确指出“reinterpret_cast运算符不应抛弃constness”。

转换constness在C ++ 03标准的5.2.11节中定义。在那里使用的符号有点令人困惑,但它基本上表明如果没有给定限定的隐式转换,两种类型之间的转换“强制转换constness”。

在您的情况下,您正尝试将int **转换为void const**。编译器询问“我可以在T **T const**之间隐式转换吗?”,答案是否定的,所以它表示你正在抛弃constness。

这里的逻辑是reinterpret_cast用于处理更改类型,而不是更改限定符(这就是const_cast的用途)。所以如果你要求它做一些你需要const_cast的东西,它就会拒绝。

答案 1 :(得分:2)

要添加/删除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*&lt; - &gt;更危险。 int*

假设您有int** bob。然后,您将其传递给一个int const** aliceconst_cast的函数。

在该函数中,他们将指向存储在只读存储器中的int的指针分配给*alice - 完全合法。

在函数外部,检查bob*bob是否有效,然后分配给**bob,您只是尝试写入只读内存。