类型转换

const_cast

  • const_cast<新类型>(表达式);会去除"表达式"的 const,volatile 属性,如下:

int const ci = 33;
int const *ciptr = &ci;
int *var0 = const_cast<int*>(&ci);
// "&ci"的正确类型应该是 int const *;const_cast 转换会去除 const 属性
// 即转换结果的类型是 int* 类型.
int const * const ciptrc = &ci;
int const * const *ciptrcptr = &ciptrc;
int **var1 = const_cast<int**>(&ciptrc);
// "&ciptrc"的正确类型是 int const * const *,const_cast 转换会去除所有的 const 属性,
// 因此转换后表达式的类型是 int**,

reinterpret_cast

  • 仅仅是重新解释了给出对象的比特模型而没有修改这个比特模型.如下:

int i = 0x1223;
int *i_ptr = &i;
float *f_ptr = reinterpret_cast<float*>(i_ptr);
// 此时 i_ptr 与 f_ptr 的值相同,均为 0x227fc;只不过在 i_ptr 中,将该值解释为一个
// 指向 int 类型数据的指针;而在 f_ptr 中,将该值解释为指向着 float 类型的指针.

struct A{
    int i;
};
struct B{
    int i;
};  
struct C:public A,public B{
};
C c;
C *c_ptr = &c;
B *b_ptr1 = (B*)c_ptr; // 此时 b_ptr1 的值为 c_ptr+sizeof(A),参见"C++对象模型"
B *b_ptr = reinterpret_cast<B*>(c_ptr);
// 此时 b_ptr 的值与 c_ptr 的值相同,即只是重新解释比特模型,并不修改比特模型.

  • reinterpret_cast 并不会去除 const,volatile 属性,如:

volatile int i = 33;
int volatile *i_ptr = &i;

float *f_ptr = reinterpret_cast<float*>(i_ptr);
// 错误:从类型"volatile int*"到类型"float*"的 reinterpret_cast 丢失了限定符

float volatile *f_ptr1 = reinterpret_cast<float volatile*>(i_ptr); 
// 正确,保留 volatile 限定符

float *f_ptr2 = const_cast<float*>(reinterpret_cast<float volatile*>(i_ptr)); 
// 此时也是正确的,利用 const_cast 来去除 const,volatile 限定符.

  • 参见 libstdc++/include/bits/move.h 中 std::__addressof 对 reinterpret_cast 的使用.

    

你可能感兴趣的:(const_cast)