具有已删除的复制构造函数的类是否具有可复制性
Is a class with deleted copy-constructor trivially copyable?
这个类是吗
class A {
public:
A() = default;
A(const A&) = delete;
};
琐碎的可复制性?(至少叮当似乎是这么认为的(直播))
特别是
A a,b;
std::memcpy(&a, &b, sizeof(A));
调用未定义的行为?
上下文:这个答案[因为被证明是错的而被删除]加上它的评论树。
更新:目前处于"就绪"状态的CWG 1734的拟议解决方案将修改[class]/p6为:
一个普通的可复制类是一个类:
- 其中,每个复制构造函数、移动构造函数、复制赋值运算符和移动赋值运算符(12.8[class.copy],13.5.3[over.ass])被删除或琐碎
- 具有至少一个未删除的复制构造函数、移动构造函数、复制赋值运算符或移动赋值运算符,以及
- 它有一个琐碎的、未删除的析构函数(12.4[class.dtor])
这会呈现类似的类
struct B {
B() = default;
B(const B&) = delete;
B& operator=(const B&) = delete;
};
不再是微不足道的可复制。(这类类别包括像std::atomic<T>
和std::mutex
这样的同步原语。)
然而,OP中的A
有一个隐式声明的、未删除的复制分配运算符,这是微不足道的,因此它仍然是微不足道的可复制运算符。
以下是CWG1734之前情况的原始答案,以供参考。
是的,有点违反直觉,它是微不足道的可复制性。[class]/p6:
一个普通的可复制类是一个:
- 没有非平凡的复制构造函数(12.8)
- 没有非平凡的移动构造函数(12.8)
- 没有非平凡的拷贝分配运算符(13.5.3、12.8)
- 没有非平凡的移动分配运算符(13.5.3、12.8),以及
- 有一个琐碎的析构函数(12.4)
[class.copy]/p12:
类X的复制/移动构造函数如果不是用户提供的,其参数类型列表等效于隐式声明的参数类型列表,如果
- 类X没有虚拟函数(10.3),也没有虚拟基类(10.1),并且
- 类X没有volatile限定类型的非静态数据成员,并且
- 选择用于复制/移动每个直接基类子对象的构造函数是琐碎的,并且
- 对于类类型(或其数组)的X的每个非静态数据成员,选择复制/移动该成员的构造函数为琐碎
类似([class.copy]/p25):
类X的复制/移动赋值运算符如果不是用户提供的,其参数类型列表等效于隐式声明的参数类型列表,如果
- 类X没有虚拟函数(10.3),也没有虚拟基类(10.1),并且
- 类X没有volatile限定类型的非静态数据成员,并且
- 为复制/移动每个直接基类子对象而选择的赋值运算符是琐碎的,并且
- 对于类类型(或其数组)的X的每个非静态数据成员,选择用于复制/移动该成员的赋值运算符为琐碎
[class.dtor]/p5:
如果析构函数不是用户提供的,并且如果:
- 析构函数不是CCD_ 4
- 其类的所有直接基类都有琐碎的析构函数,并且
- 对于类类型(或其数组)的类的所有非静态数据成员,每个此类都有一个平凡的析构函数
[dcl.fct.default]/p5:
如果函数是用户声明的而不是显式的,则它是用户提供的在其第一次声明时默认或删除。
事实上,这一直是委员会自身问题的根源,因为在当前的定义下,atomic<T>
(以及互斥和条件变量)是微不足道的可复制性。(很明显,允许某人在不调用UB的情况下通过atomic
或mutex
进行memcpy
是……有严重问题的。)另请参阅N4460。
相关文章:
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 是否可以为 QPixmap 派生类嵌入缩放方法?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 简单可复制与可简单复制
- 了解类型是否可调用
- 在调用其析构函数之前,是否有任何实际理由检查某些东西是否可破坏?
- '_HAS_CXX17'宏是否可用于自定义项目标头以启用C++17 语言集功能?
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 键入特征以检查类型是否可从流和 MSVC 读取
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 是否可以为 std::cout 创建别名?
- 对于参加可复制和可移动类的访问者来说,应该有多少过载?
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 具有已删除的复制构造函数的类是否具有可复制性
- 类型 traits,用于检查参数包中的所有类型是否都是可复制构造的
- 使用 libtool 测试类是否可复制可构造
- 如何确定 c++ 类是否可复制
- 一个普通的可复制的::std::元组类模板可能吗?是否存在实现
- visual C++标准是否要求自己的迭代器是另一个可移动/可复制的