【发布时间】:2015-05-25 16:15:13
【问题描述】:
uint32_t Seed() {
uint64_t seed = GetSomeReasonable64BitIntegerSeed();
return *(uint32_t*)&seed ^ *((uint32_t*)&seed + 1);
}
上面不是真正的代码,但这基本上是真正的代码所做的。我收到了来自 g++ 的警告,它违反了严格的别名,用谷歌搜索它,好吧,我想修复它。我找到了this 问题,但除了使用memcpy 或依赖未定义但实际上没有问题的行为(即访问工会的未设置成员)之外,它没有给出明确的解决方案。
目前我能想到的选项是,
- 使用
memcpy。 - 使用
union并将这部分编译为 C,其中语言标准允许通过联合进行类型双关。
【问题讨论】:
-
安全类型双关语可以使用
std::bit_cast完成。但这实际上是一个 XY 问题,根本不需要类型双关
标签: c++ casting type-punning