Arhadthedev Asked:2020-09-09 16:22:40 +0000 UTC2020-09-09 16:22:40 +0000 UTC 2020-09-09 16:22:40 +0000 UTC reinterpret_cast 存在的意义何在? 772 在 C++ 中,有一个运算符reinterpret_cast,其含义是在相互不兼容的类型之间进行强制转换。 但是,这种转换违反了严格的别名规则,这会引发未定义的行为。不违反此规则的相同变换适合const_cast,static_cast和dynamic_cast。 如果它的使用违反了标准,那么这个运算符的存在意义是什么? c++ 3 个回答 Voted Best Answer αλεχολυτ 2020-09-23T00:12:04Z2020-09-23T00:12:04Z reinterpret_cast不仅仅用于将指针从一种类型转换为另一种类型。有几种不同的转换。cppreference.com重点介绍了 11 个转换选项: 进入你自己的类型 指向整型的指针 指针的整数类型 类型std::nullptr_t转整型 一种类型的指针指向另一种类型的指针 一种类型的左值转换为对另一种类型的引用 指向一种类型的函数的指针 指向另一种类型的函数的指针 函数指针在void* 任何类型的空指针指向任何其他类型的指针 一种类型的右值指针指向成员函数 指向另一种类型的指针指向成员函数 一种类型的右值数据成员指针指向另一种类型的另一种数据成员指针 类型别名规则仅影响项目 5 和 6,并且在以下情况下可以安全地使用结果(即不违反strict-aliasing ): 结果类型是原始对象的动态类型 结果类型和动态类型指向同一个类型T 结果类型是源对象类型的有符号或无符号版本。 结果类型是聚合类型或union包含用作源对象的元素或非静态数据成员。那些。您可以通过指向其成员来获取指向结构的指针。 结果类型是原始对象的动态类型的基类,该类型是标准布局类,不包含非静态数据成员,结果类型是第一个基类。 结果类型是指向char或unsigned char的指针std::byte。 一些实现将这些规则放松为非标准语言扩展。 Arhadthedev 2020-09-09T16:22:40Z2020-09-09T16:22:40Z 不兼容的类型之间只有一种不违反严格别名规则的转换——从任意指针到类型指针char*。也就是说,reinterpret_cast它允许您将任意对象表示为字节序列(因为标准保证单字节长度char-a)。 以下是此类转换的有效使用示例: template<class T> void putIntoStream(const T* object, std::ostream& out) { out.write(reinterpret_cast<const char*>(object), sizeof(T)); } 对于其他一切,都有memcpy(). Ariox 2020-09-09T16:33:29Z2020-09-09T16:33:29Z 尽管reinterpret_cast在大多数情况下使用会导致未定义的行为,但库可以通过针对特定编译器测试它们来在其实现中使用它。对于库的用户,行为将不再是未定义的,因为 它经过测试并记录在案,但必须考虑支持的编译器列表。有时这是开发跨平台库的唯一方法。 此外,仍然存在必须牺牲可移植性才能实现其他目标的情况(特别是对于微控制器来说更是如此)。
reinterpret_cast不仅仅用于将指针从一种类型转换为另一种类型。有几种不同的转换。cppreference.com重点介绍了 11 个转换选项:std::nullptr_t转整型void*类型别名规则仅影响项目 5 和 6,并且在以下情况下可以安全地使用结果(即不违反strict-aliasing ):
Tunion包含用作源对象的元素或非静态数据成员。那些。您可以通过指向其成员来获取指向结构的指针。char或unsigned char的指针std::byte。一些实现将这些规则放松为非标准语言扩展。
不兼容的类型之间只有一种不违反严格别名规则的转换——从任意指针到类型指针
char*。也就是说,reinterpret_cast它允许您将任意对象表示为字节序列(因为标准保证单字节长度char-a)。以下是此类转换的有效使用示例:
对于其他一切,都有
memcpy().尽管
reinterpret_cast在大多数情况下使用会导致未定义的行为,但库可以通过针对特定编译器测试它们来在其实现中使用它。对于库的用户,行为将不再是未定义的,因为 它经过测试并记录在案,但必须考虑支持的编译器列表。有时这是开发跨平台库的唯一方法。此外,仍然存在必须牺牲可移植性才能实现其他目标的情况(特别是对于微控制器来说更是如此)。