4

我遇到了与 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**”到类型“const void**”的 reinterpret_cast 丢弃了限定符

有谁知道为什么编译器说我正在抛弃 const 。我和我的几个同事都不知道这是怎么回事。

感谢帮助!

4

2 回答 2

9

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

C++03 标准的第 5.2.11 节定义了弃用 constness。那里使用的表示法有点令人困惑,但它基本上表明,如果给定的限定没有隐式转换,则两种类型之间的强制转换会“抛弃常量”。

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

这里的逻辑是 reinterpret_cast 用于处理更改类型,而不是更改限定符(这就是 const_cast 的用途)。因此,如果您要求它做一些您需要 const_cast 的事情,它会拒绝。

于 2013-02-01T15:45:19.097 回答
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);

请注意, aint const**和 aint**是非常不同的类型,在它们之间进行转换是危险的——比void*<->更危险int*

假设你有一个int** bob. int const** alice然后你将它传递给一个接受 a到a 的函数const_cast

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

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

于 2013-02-01T15:46:46.363 回答