Rei*_*izo 5 c++ undefined-behavior language-lawyer
sizeof(double) char在寻找将s 组合到 a 的方法时double,我读了几篇文章,std::memcpy推荐使用以下方法:
char bytes[sizeof(double)];
// fill array
double d;
std::memcpy(&d, bytes, sizeof(double));
Run Code Online (Sandbox Code Playgroud)
但是,我想知道为什么进一步使用d可以定义行为。
如果它不是一个double,而是一个复杂的类对象,那么访问它肯定也不会被定义,不是吗?那么,为什么double.
编辑:为了使我的问题清楚,我想指定我的目标:我想找到一种方法将多个chars 组合成 adouble并进一步使用这个 double,而不会导致未定义的行为。我不double希望指定 的值。无论如何,我认为这是不可能的,因为标准甚至没有说明任何有关大小的信息,更不用说double. 但是,我要求d有一些有效的(即“可访问的”)double值。
\n\n为什么使用 std::memcpy 进行类型双关不会导致未定义的行为?
\n
因为语言是这样说的(最新草案):
\n\n\n[基本类型]
\n对于普通可复制类型 T 的任何对象(除了潜在重叠的子对象),无论该对象是否持有类型 T 的有效值,构成该对象的底层字节([intro.memory])都可以复制到char、unsigned char 或 std\xe2\x80\x8b::\xe2\x80\x8bbyte ([cstddef.syn]) 的数组。\n如果该数组的内容被复制回对象,则该对象随后应保持其原始值。
\n
但请注意该规则的条件。您的代码可能具有未定义的行为,但如果复制的值最初是从另一个双精度值复制的,或者实际上,如果该值可以从双精度值复制,则不会(除非其他规则这么说)。
\n\n\n如果它不是一个 double 对象,而是一个复杂的类对象,那么访问它肯定也不会被定义,不是吗?
\n
取决于你所说的复杂性是什么意思。适用的条件在引用的规则中。
\n| 归档时间: |
|
| 查看次数: |
639 次 |
| 最近记录: |