为什么一对常量是微不足道的可复制的,而对不是?
Why is pair of const trivially copyable but pair is not?
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 时,输出true
false
.
当我使用 Clang 5.0 或 GCC 5.2 时,输出false
false
。
为什么会有差异?
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(为 删除或琐碎, ...
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- 为什么一对常量是微不足道的可复制的,而对不是?