Илья Asked:2023-06-11 20:08:40 +0000 UTC2023-06-11 20:08:40 +0000 UTC 2023-06-11 20:08:40 +0000 UTC 为什么删除复制构造函数不会使类不可复制? 772 class A { A(const A&) = delete; }; #include <type_traits> static_assert(std::is_trivially_copyable_v<A>); 为什么没有出现编译错误,因为复制构造函数已从类中移除? c++ 1 个回答 Voted Best Answer user7860670 2023-06-11T20:38:03Z2023-06-11T20:38:03Z 显式和隐式删除的构造函数都满足平凡性标准。 11.4.4.2 复制/移动构造函数 [class.copy.ctor] 11 类 X 的复制/移动构造函数是微不足道的,如果它不是用户提供的并且如果: - (11.1) 类 X 没有虚函数 (11.7.2)并且没有虚拟基类 (11.7.1),并且 - (11.2) 选择复制/移动每个直接基类子对象的构造函数是微不足道的,并且 - (11.3) 对于 X 的每个类类型的非静态数据成员(或其数组),选择复制/移动该成员的构造函数是微不足道的; 否则复制/移动构造函数是不平凡的。 类本身将满足平凡可复制性的标准: 11.2 类的属性 [class.prop] 1 可平凡复制的类是这样一个类: - (1.1) 至少有一个合格的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符(11.4.3、11.4.4.2 , 11.4.5), - (1.2) 其中每个符合条件的复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符都是平凡的,并且 - ( 1.3) 具有平凡的、未删除的析构函数 (11.4.6)。 trivially copyable trait 的意思是这种类型的对象可以使用std::memcpy或者 I/O 操作进行复制。但是,这并不一定意味着它们必须定义构造函数和/或复制运算符。例如,A您可以复制std::memcpy,但不是以通常的方式: class A { int & x; }; #include <type_traits> static_assert(std::is_trivially_copyable_v<A>); static_assert(not std::is_copy_assignable_v<A>); 在线编译器 不同的可复制性特征不按照相互增强的原则工作,例如在输入、正向、双向、随机访问迭代器链中,而是独立工作。
显式和隐式删除的构造函数都满足平凡性标准。
类本身将满足平凡可复制性的标准:
trivially copyable trait 的意思是这种类型的对象可以使用
std::memcpy或者 I/O 操作进行复制。但是,这并不一定意味着它们必须定义构造函数和/或复制运算符。例如,A您可以复制std::memcpy,但不是以通常的方式:在线编译器
不同的可复制性特征不按照相互增强的原则工作,例如在输入、正向、双向、随机访问迭代器链中,而是独立工作。