const_cast 是否只是一种告诉编译器“停止呻吟,将其视为非常量指针”的方法?是否有任何情况将 const_cast 本身转换为实际的机器代码?
答案 0 :(得分:12)
不,它只是在编译时删除了const属性。
答案 1 :(得分:5)
可以想象,可能存在一种架构,其中const指针与非const指针具有不同的表示,在这种情况下,编译器必须发出一些代码。但是,我不知道任何这样的架构。
答案 2 :(得分:3)
const_cast只会丢弃属性的常量而已。
答案 3 :(得分:2)
const
不会更改类型的表示形式,尤其是T*
的表示形式与T const*
完全相同。
考虑:
int i,
* const cpi = &i,
* const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*
同时代表cpi
代表int*
和int const*
来自*pcpci
。
初始化cpi
时,无法更改pcpci
的表示形式。
当然,如果指针对象具有非重要位,编译器可以随机翻转它们;特别是,const_cast
可以翻转指针的非重要位,但任何隐式转换也可以。我不认为这种情况存在于现实世界中。
当两个不同的位模式导致相同的地址值(当偏移量足够大时,基数+偏移量)时,同样适用。