我知道当我定义一个空类并且根本不提供声明时,编译器将提供默认和复制构造函数,析构函数和复制赋值运算符的定义.
有什么规则?什么时候编译器不提供复制构造函数?移动构造函数和移动赋值运算符怎么样?
(例如:如果我的类有一个类似int&的引用成员,编译器将不会为任何赋值运算符提供定义.否则会发生类似这样的事情?)
最佳答案 编辑:在C 11中,它比隐式声明更复杂.它们可以是隐式声明和默认,隐式声明和删除,也可以是未声明的.阅读
this以区分后者2.以下信息并不完全正确,因为它不区分已声明和已删除与未声明.
以下是正在进行的工作. (?)表示我想澄清或量化该陈述.
特别会员职能§12/ 1
当用户没有显式声明它们时,实现将隐式声明某些类类型的这些成员函数:
>默认构造函数
>复制构造函数
>复制赋值运算符
>移动构造函数
>移动赋值运算符
>析构函数
如果类型具有…,则不会隐式声明特殊成员函数.
默认构造函数§12.1/ 5
复制构造函数§12.8/ 8,§12.8/ 12
>用户声明的移动构造函数
>用户声明的移动赋值运算符
> rvalue引用类型的非静态数据成员
>变量成员具有非平凡的复制构造函数,并且是类似联合的类(?)
>无法复制的类型(或其数组)的非静态数据成员
>直接或虚拟基类,没有可访问的复制构造函数
*如果类具有用户声明的复制赋值运算符或用户声明的析构函数(?),则不推荐使用这种隐式声明
复制分配运算符§12.8/ 19,§12.8/ 24
>用户声明的移动构造函数
>用户声明的移动赋值运算符
>具有非平凡复制赋值运算符的变体成员,并且是类似联合的类(?)
> const非类型(或其数组)的非静态数据成员
>引用类型的非静态数据成员
>具有无法访问的复制赋值运算符的非静态数据成员
>具有不可访问的复制赋值运算符的直接或虚拟基类
*如果类具有用户声明的复制构造函数或用户声明的析构函数(?),则不推荐使用此类隐式声明
移动构造函数§12.8/ 10,§12.8/ 12
>用户声明的复制构造函数
>用户声明的复制赋值运算符
>用户声明的移动赋值运算符
>用户声明的析构函数
>移动构造函数不会被隐式定义为已删除(?)
>变量成员有一个非平凡的移动构造函数,是一个类似联合的类(?)
>无法移动的类型(或其数组)的非静态数据成员
>非静态数据成员或直接或虚拟基类,其类型不具有移动构造函数,并且不可轻易复制
>没有可访问移动构造函数的直接或虚拟基类
移动分配运算符§12.8/ 21,§12.8/ 24
>用户声明的复制构造函数
>用户声明的移动构造函数
>用户声明的复制赋值运算符
>用户声明的析构函数
>移动赋值运算符不会被隐式定义为已删除(?)
>具有非平凡移动赋值运算符的变体成员,并且是类似联合的类(?)
> const非类型(或其数组)的非静态数据成员
>引用类型的非静态数据成员
>具有无法访问的移动赋值运算符的非静态数据成员,并且不可轻易复制
>具有不可访问的移动赋值运算符的直接或虚拟基类,并且不是简单的可复制的
析构函数§12.4/ 4