对于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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。