其他分享
首页 > 其他分享> > 是否在C 14中始终定义了对可复制对象的复制?

是否在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