首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::bit_cast在C++11中的安全等价

std::bit_cast在C++11中的安全等价
EN

Stack Overflow用户
提问于 2021-05-13 14:48:03
回答 2查看 1.1K关注 0票数 1

C++20引入了投射来处理相同的比特,就好像它们是一种不同的类型。所以,基本上它是这样做的:

代码语言:javascript
复制
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 *指向相同的位置,并且能够从这两个位置读取和写入,而不是定义的行为?

EN

Stack Overflow用户

发布于 2021-05-13 21:01:25

几乎每个C或C++编译器,很可能包括适合于涉及bit_cast的任务的每个编译器,都包括通过定义标准不要求的行为来扩展语言的配置选项。我还没有看到任何已发布的C++标准的基本原理文档,但C标准的作者明确地将UB描述为识别“一致性语言扩展”的领域,并将对这种“流行扩展”的支持视为标准管辖范围之外的实现质量问题。

一个构造不能在所有C或C++编译器配置中移植,这并不意味着它不能或不应该安全地用于支持它的配置。我建议设计一些可以定义宏的头来处理三种方法中的一种,具体取决于实现:

  1. 对于支持bit_cast的实现,请使用它。
  2. 对于使用特定于编译器的语法扩展语言以支持类型双关的实现,请使用该实现。
  3. 对于其他实现,请指定编译器必须配置为扩展该语言,至少在使用公共操作序列时支持类型双关。

虽然可能存在这些方法都不适合的实现,但在大多数实现中,至少有一种是有效的。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67521312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档