为什么一对常量是微不足道的可复制的,而对不是?

Why is pair of const trivially copyable but pair is not?

本文关键字:微不足道 常量 为什么 可复制      更新时间:2023-10-16
std::cout << std::boolalpha;
std::cout << std::is_trivially_copyable< std::pair<const int,int> >::value;
std::cout << std::is_trivially_copyable< std::pair<int,int> >::value;

当我使用 GCC 9.2 时,输出truefalse.

当我使用 Clang 5.0 或 GCC 5.2 时,输出falsefalse

为什么会有差异?

std::pair有一个非平凡的复制赋值和移动赋值运算符。这可以防止它被简单地复制。

从 C++17 开始,如果两个包含的类型之一不可分配,则复制/移动赋值运算符定义为已删除,这将解除对简单可复制的限制。之所以如此,是因为const int不可复制分配或移动分配。

C++17 还指出,如果这两种类型具有平凡析构函数,那么该对也将有一个平凡析构函数,这是平凡可复制的另一个要求。

您测试的较旧的编译器可能不完全支持 C++17,这阻止了该对即使对于pair<const int, int>也可以轻松复制。

在第一种情况下,将删除复制赋值运算符和移动赋值运算符。因此,该类是可以复制的。

在第二种情况下,至少复制赋值运算符不会被删除,也不是微不足道的。

从C++ 20(11.1 类的属性(

1 一个平凡的可复制类是一个类:

(1.1( — 其中每个复制构造函数、移动构造函数、复制赋值 运算符,移动赋值运算符 (11.3.4.2,11.3.5(为 删除或琐碎, ...