C++ 如何在C++;?

C++ 如何在C++;?,c++,strict-aliasing,type-punning,stdlaunder,C++,Strict Aliasing,Type Punning,Stdlaunder,据我所知,所有执行此操作的“传统”方法,即重新解释指针的强制转换,以及与int和float字段的联合,都违反了严格的别名()。 那么,如何在没有未定义行为的情况下正确地执行它呢 我是否可以对字符进行重新解释并将其存储到uint32\t?或者可能std::launder会有所帮助?正如所指出的,标准的方法是使用memcpy: float f = 1.0; std::byte c[sizeof(f)]; memcpy(c, &f, sizeof(f)); 您可能认为您不想复制任何内容,只想

据我所知,所有执行此操作的“传统”方法,即
重新解释指针的强制转换
,以及
int
float
字段的联合
,都违反了严格的别名()。
那么,如何在没有未定义行为的情况下正确地执行它呢


我是否可以对字符进行
重新解释
并将其存储到uint32\t?或者可能
std::launder
会有所帮助?

正如所指出的,标准的方法是使用
memcpy

float f = 1.0;
std::byte c[sizeof(f)];
memcpy(c, &f, sizeof(f));

您可能认为您不想复制任何内容,只想查看位/字节。编译器很聪明,事实上,他们会像Jason所演示的那样对其进行优化,所以不要担心,对于这种情况,请使用
memcpy
,如果您只想“获取”位表示,请永远不要
重新解释\u cast

,您只需将指向
float
的指针转换为
const unsigned char*
,并使用生成的指针检查对象的字节。但你为什么要提到“memcpy this to float”?复制到
浮点值
时未获得位表示;它正在改变位。你到底想做什么?在cppcon 2019上有一个关于这个问题的讨论。你可能对它感兴趣。@EricPostpischil是的,对不起,我的意思是“memcpy to uint32\u t”,我会编辑这个问题。
memcpy to uint32\u t
-你为什么要这样做来打印位?你可以从
char
@KamilCuk打印它们,我想把它们作为一个连续的东西,得到有效位和指数;从字符数组中获取它们会有点乏味。这里值得一提的是C++20。没错!这将是做这件事的标准方式。我不害怕复制,我害怕未定义的行为:)谢谢!那么
std::launder
呢?@Amomum
std::laundr
s的返回类型与其参数类型相同。所以从
float
unsigned
的转换是不可能的。@Timo
std::launder(reinterpret_cast(f))
呢?