复制普通可复制对象是否总是在 C++14 中定义?

2024-04-06

For a 可以简单地复制 http://en.cppreference.com/w/cpp/concept/TriviallyCopyableT 型考虑:

void f(T z)
{
   T a;
   T b;
   std::memcpy(&b, &a, sizeof(T));

   a = z;
   b = z;

   // ...
}

该片段的行为是在 C++14 中定义的吗

  1. T 是字符,
  2. T 是 int,或者
  3. T 是 struct { int data; }; ?

假使,假设f传递一个包含有效值的对象。

如果致电,答案会改变吗memcpy被替换为复制作业 b = a?

结果可以结转到复制构造 T(a) and 移动构建/分配?


Note: 这个问题与什么是聚合和 POD?它们有何特别之处/为何如此特别? https://stackoverflow.com/questions/4178175,特别关注复制的极端情况不确定值.


这里有几件事在起作用:

  • 计算结果为不确定值的表达式会导致未定义的行为,但有某些例外 (8.5p12)
  • unsigned char(并且可能char,如果无符号)是例外
  • 具有自动存储持续时间且其类型具有简单默认初始化的变量最初具有不确定的值 (5.3.4p17)

这意味着

  • unsigned char没关系,无论是否使用memcpy or memmove或复制赋值或复制构造函数
  • memcpy and memmove大概适用于所有类型,因为结果不是“由评估产生”(为了满足此要求,实现可以使用unsigned char内部,或利用为其他类型所做的特定于实现的保证)
  • 如果右侧是不确定的值,其他类型的复制构造函数和复制赋值将会失败

当然,即使复制不确定值的有效方法也会创建另一个不确定值。


段落编号对应草案 n4527

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制普通可复制对象是否总是在 C++14 中定义? 的相关文章

随机推荐