Effetive C++: reinterpret_cast

谁说我不能喝 提交于 2020-04-06 22:02:49

 

    语法:

reinterpret_cast < new_type > ( expression ) 	

    不像static_cast,但是const_cast,reinterpret_cast会生成CPU instructions(CPU指令).它是完全由编译器来实现的通过对 the sequence of bit操作来实现 old_type 到 new_type.

只有以下几点可用于 reinterpret_cast:

1, 整数(integer), 枚举(enumeration), 指针(pointer), 成员指针(pointer to member)的表达式转为自身同类型,转换后的结果不受到影响.

2, 任何指针类型都可以转为一个足够大的整数.

3, 整数(integer), 枚举(enumeration)可以转为一个指针类型,当该指针类型转为回原来的类型的或者比原来的类型更大的类型的时候是安全的也会丢失精度. 如果是转为比原来小的类型是不安全的(unsafe)而且编译器也不保证转换成功.

4, 任何std::nullptr_t的值都可以转为任意integer类型,类似: (void*)0.

5, Ty1* obj1 可以转为 Ty2* obj2, 如果Ty2的内存对齐要求没有Ty2严格那么再次cast回来也是安全的.

6, Ty1& obj1(Ty1&称为 DynamicType)可以转为 Ty2& obj2(Ty2&称为 AliasedType), 转换结果仍是一个 lvalue 或者 xvalue, 仍然引用原来的obj1. 但是除了通过obj1来modify/read obj1中存储的value. 我们还可以通过 type aliasing rulesmodify/read obj1中的value.

 what is type aliasing rules(see blow)?

    (1), 如果AliasedType 和 DynamicType一样那么可以直接修改. 例如:

int number{ 10 };
int& ref_number{ reinterpret_cast<int&>(number) };
ref_number = 20;

std::cout << number << std::endl; //output: 20;

    (2), 如果AliasedType是 CV-qualify仍然是可以read safely.

    int number{10};
    const int &ref_number{reinterpret_cast<int &>(number)};

    std::cout << number << std::endl; //output: 10;

(3), 如果AliasedType是带 unsigned/signed的DynamicType, 仍然是read/modify safely.

    int number{10};
    unsigned int &ref_number{reinterpret_cast<unsigned int &>(number)};
    ref_number = 20u;

    std::cout << number << std::endl; //output: 10;

(4), 如果AliasedType是unsigned char*/std::byte*,仍然是可以access safely.(这里涉及到value representation/object representation).

demo for 6

7, 任何指向函数类型的指针都可以转为另外一种指向函数类型的指针,但是通过被转换的结果调用用该函数是UB的.如果再转回原来的类型是没有任何问题的!

   int f() { return 42; }    


    void(*fp1)() = reinterpret_cast<void(*)()>(f);
    // fp1(); undefined behavior
    int(*fp2)() = reinterpret_cast<int(*)()>(fp1);
    std::cout << std::dec << fp2() << '\n'; // safe

8, 在POSIX兼容的(compatible)指向函数的指针可以被转为void*类型,如果再转为原来的类型也是安全的(safe),仍然可以被调用的(callable).

9,一个指向 member function的 rvalue可以被转为任何其他类型的指针,如果再转回来,仍然是有效的,可以安全的调用的.

10, 一个指向 member object的 rvalue可以转为一个指向其他类型(内存对齐要求必须跟原来的一致或者不如原来的严格)的member object,如果再转回来仍然可以安全的有效的调用.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!