C++20引入了投射来处理相同的比特,就好像它们是一种不同的类型。所以,基本上它是这样做的:
template <typename T1, typename T2>
T2 undefined_bit_cast(T1 v1) {
T1 *p1 = &v1;
T2 *p2 = (T2 *)p1; // Uh oh.
T2 v2 = *p2; // Oh no! Don't do that!
return v2;
}除非没有允许编译器使用硬盘驱动器删除方法替换此方法的未定义行为。
我想使用std::bit_cast,但是我不得不使用C++11。
后续问题:是否存在指针位转换?一个安全的方法可以让T1 *和T2 *指向相同的位置,并且能够从这两个位置读取和写入,而不是定义的行为?
发布于 2021-05-13 21:01:25
几乎每个C或C++编译器,很可能包括适合于涉及bit_cast的任务的每个编译器,都包括通过定义标准不要求的行为来扩展语言的配置选项。我还没有看到任何已发布的C++标准的基本原理文档,但C标准的作者明确地将UB描述为识别“一致性语言扩展”的领域,并将对这种“流行扩展”的支持视为标准管辖范围之外的实现质量问题。
一个构造不能在所有C或C++编译器配置中移植,这并不意味着它不能或不应该安全地用于支持它的配置。我建议设计一些可以定义宏的头来处理三种方法中的一种,具体取决于实现:
虽然可能存在这些方法都不适合的实现,但在大多数实现中,至少有一种是有效的。
https://stackoverflow.com/questions/67521312
复制相似问题