第 12.8/7 节中的标准说:
如果类定义没有显式声明复制构造函数,则隐式声明。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制构造函数定义为已删除;否则,它被定义为默认值(8.4)。如果 类具有用户声明的复制赋值运算符或用户声明的 析构函数,则不推荐使用后一种情况。因此,对于类定义
struct X { X(const X&, int); };
复制构造函数是隐式声明的。如果用户声明的构造函数后来被定义为
X::X(const X& x, int i =0) { /∗ ... ∗/ }
我不明白如果该类具有用户声明的复制赋值运算符或用户声明的析构函数,则不推荐使用后一种情况。在示例中,标准既不提供用户声明的复制赋值运算符也不提供析构函数。如果我们声明析构函数或复制赋值运算符会发生什么?我试图这样做如下:
struct A
{
~A(){ };
};
A::A(const A&){ }; //error
int main(){ }
但在示例中,我们仍然有隐式声明的复制构造函数。该规则的实际含义是什么?
我想如果我们写以下内容:
struct A
{
A(){ };
A(const A&&){ };
~A(){ };
};
A a;
A t = a; //error: call to implicitly-deleted copy constructor of 'A'
int main()
{
}
复制构造函数不会显式删除。但事实并非如此。