是否在C 14中始终定义了对可复制对象的复制?
作者:互联网
对于trivially copyable型T,请考虑:
void f(T z)
{
T a;
T b;
std::memcpy(&b, &a, sizeof(T));
a = z;
b = z;
// ...
}
是否在C 14中定义了此片段的行为,如果
> T是char,
> T是int,或
> T是struct {int数据; }; ?
假设f传递了一个持有有效值的对象.
如果将memcpy的调用替换为副本分配b = a,答案是否会更改?
结果可以结转以复制构造T(a)并移动构造/分配吗?
注意:与What are Aggregates and PODs and how/why are they special?相比,此问题特别关注复制不确定值的特殊情况.
解决方法:
这里有几件事在起作用:
>计算为不确定值的表达式会导致不确定的行为,但有某些例外情况(8.5p12)
>无符号字符(如果没有符号,则可能是字符)是例外
>具有自动存储持续时间且类型具有默认初始化的变量,初始时具有不确定的值(5.3.4p17)
这意味着
>无论使用memcpy还是memmove还是copy-assignment或copy-constructor,unsigned char都可以
> memcpy和memmove可能对所有类型都适用,因为结果不是“通过求值产生的”(为了满足此要求,实现可以在内部使用未签名的char或利用为其他类型实现的特定于实现的保证)
>如果右侧的值不确定,则其他类型的复制构造函数和复制分配将失败
当然,即使是复制不确定值的有效方法也会创建另一个不确定值.
段落编号对应于n4527草案
标签:c,undefined-behavior,c14 来源: https://codeday.me/bug/20191011/1891346.html