reinterpret_cast conversion
通过重新解释基础位模式在类型之间进行转换。
句法
reinterpret_cast < new_type > ( expression ) | | |
|---|
返回类型的值。new_type...
解释
不像static_cast,但就像const_cast,reinterpret_cast表达式不编译到任何CPU指令。它纯粹是一个编译器指令,它指示编译器将表达式的位数%28对象表示形式%29的序列视为具有新类型。[医]类型。
只有以下转换可以使用reinterpret_cast,除非这种转换会被抛弃。恒恒或波动率...
1%29积分、枚举、指针或指针到成员类型的表达式可以转换为自己的类型.。的值与expression.%28自C++11%29
2%29任何指针都可以转换为足够大的任何整数类型,以容纳指针%28例如的值。到std::uintptr_t%29
3%29任何整数或枚举类型的值都可以转换为指针类型。将指针转换为足够大小的整数并返回到相同指针类型的指针,保证具有其原始值,否则不能安全地取消所产生的指针%28,因此不能保证相反方向的往返转换;相同的指针可能有多个整数表示%29空指针常量NULL或整数零不能保证产生目标类型的空指针值;静态[医]铸造或隐式转换应该被用于这个目的。
4%29任何类型的值std::nullptr_t,包括nullptr可以转换为任何整数类型,就好像它是(void*)0,但没有价值,甚至nullptr可以转换为std::nullptr_t*static_cast应该被用于这个目的。%28自C++11%29
5%29指向类型对象的任何指针T1可以将指针转换为另一种类型的对象。CVT2这完全等同于static_cast<cv T2*>(static_cast<cv void*>(expression))%28,这意味着如果T2%27s对齐要求并不比T1%27 s,指针的值不会更改,并且将结果指针转换回其原始类型将产生原始值%29。在任何情况下,只有在类型混叠规则%28见下文%29
6%29类型的值表达式T1可以转换为另一种类型的引用。T2结果是一个lvalue或xvalue,它与原始lvalue相同,但具有不同的类型。不创建临时函数、不复制、不调用构造函数或转换函数。类允许时,才能安全地访问结果引用。类型混叠规则%28见下文%29
7%29任何指向函数的指针都可以转换为指向不同函数类型的指针。通过指向不同函数类型的指针调用函数是未定义的,但是将该指针转换为指向原始函数类型的指针将产生指向原始函数的指针。
8%29在某些实现(%28)上,特别是在任何POSIX兼容系统上,如dlsym%29,函数指针可以转换为void*或任何其他对象指针,反之亦然。如果实现支持双向转换,则转换到原始类型将产生原始值,否则无法取消引用或安全地调用结果指针。
9%29任何指针类型的空指针值可以转换为任何其他指针类型,从而导致该类型的空指针值。注意,空指针常量nullptr或任何其他类型的值std::nullptr_t不能将指针转换为reinterpret_cast隐式转换或static_cast应该被用于这个目的。
10%29指向成员函数的rvalue指针可以转换为指向不同类型的不同成员函数的指针。转换为原始类型将产生原始值,否则无法安全地使用结果指针。
11%29指向某类成员对象的rvalue指针。T1可以转换为指向另一个类的另一个成员对象的指针。T2.如果T2%27s对齐并不比T1%27 s,转换到原始类型将产生原始值,否则无法安全地使用结果指针。
与所有强制转换表达式一样,结果是:
- 如果是新的[医]类型是lvalue引用类型或函数类型的rvalue引用;
- 如果是新的xvalue[医]类型是对对象类型的rvalue引用;
- 要价不一样。
关键词
reinterpret_cast...
类型混叠
当指针或对其对象的引用动态类型是DynamicType是reinterpret_cast%28或C型铸造%29指向不同类型的对象的指针或引用AliasedType,强制转换总是成功的,但只有在下列情况之一为真的情况下,才能使用结果指针或引用访问对象:
AliasedType是%28可能CV-合格%29DynamicType
AliasedType和DynamicType都是%28可能是多层次的,也可能是cv-限定在每个级别上都是指向同一类型的%29指针。T%28自C++11%29
AliasedType%28有可能CV-限定%29签名或无符号变体DynamicType
AliasedType是集料类型或者是联合作为元素或非静态成员%28保存上述类型之一的类型,递归地包括包含的联合%29的子聚合元素和非静态数据成员的元素:这可以安全地获得指向结构或联合的可用指针,该指针具有指向其非静态成员或元素的指针。
AliasedType是%28可能CV-合格%29基类成DynamicType和DynamicType是没有非静态数据成员的标准布局类,并且AliasedType是它的第一个基类。
AliasedType是char,,,unsigned char,或std::byte*这允许对对象表示作为字节数组的任何对象。
如果AliasedType通过新指针或引用调用访问对象时,无法满足这些要求。未定义行为这被称为严格混叠规则和应用于C++和C编程语言。
注意,许多C++编译器将此规则放宽为非标准语言扩展,以允许通过非标准语言扩展的非活动成员进行错误类型的访问。联合%28这种访问在C%29中不是未定义的。
还请注意,这组规则比C编程语言中的等效规则更严格:C允许通过指向任何兼容类型的指针进行访问。C++没有兼容类型,并且不允许通过指针或引用访问布局兼容类型如果它不满足%28上面列出的任何规则,则可以允许对其成员的访问%29。
注记
C++98不允许在函数指针和void*,这是由dr.CWG 195...
例
演示重新解释的一些用途。[医]演员:
二次
#include <cstdint>
#include <cassert>
#include <iostream>
int f() { return 42; }
int main()
{
int i = 7;
// pointer to integer and back
uintptr_t v1 = reinterpret_cast<uintptr_t>(&i); // static_cast is an error
std::cout << "The value of &i is 0x" << std::hex << v1 << '\n';
int* p1 = reinterpret_cast<int*>(v1);
assert(p1 == &i);
// pointer to function to another and back
void(*fp1)() = reinterpret_cast<void(*)()>(f);
// fp1(); undefined behavior
int(*fp2)() = reinterpret_cast<int(*)()>(fp1);
std::cout << std::dec << fp2() << '\n'; // safe
// type aliasing through pointer
char* p2 = reinterpret_cast<char*>(&i);
if(p2[0] == '\x7')
std::cout << "This system is little-endian\n";
else
std::cout << "This system is big-endian\n";
// type aliasing through reference
reinterpret_cast<unsigned int&>(i) = 42;
std::cout << i << '\n';
const int &const_iref = i;
//int &iref = reinterpret_cast<int&>(const_iref); //compiler error - can't get rid of const
//Must use const_cast instead: int &iref = const_cast<int&>(const_iref);
}二次
可能的产出:
二次
The value of &i is 0x7fff352c3580
42
This system is little-endian
42二次
另见
const_cast conversion | adds or removes const |
|---|---|
static_cast conversion | performs basic conversions |
dynamic_cast conversion | performs checked polymorphic conversions |
explicit casts | permissive conversions between types |
standard conversions | implicit conversions from one type to another |
© cppreference.com在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com

