可以通过将拷贝控制成员定义为 =default 来显示地要求编译器生成合成版本。
class Foo
{
public:
Foo() = default; // 使用=default默认, 合成生成构造函数
Foo(const Foo &) = default; //使用=default默认, 合成生成拷贝构造函数
Foo &operator=(const Foo &); // 声明拷贝赋值运算符
~Foo() = default; // 使用=default默认, 合成析构函数
};
Foo &Foo::operator=(const Foo &) = default; // 使用=default默认,合成拷贝赋值运算符
特别注意:
在类内使用=default修饰成员的声明时,合成的函数将隐式地声明为内联的(就像任何其他类内声明的成员函数一样)。
如果不希望合成的成员时内联函数,应该只对成员的类外定义使用=default,就像上面拷贝赋值运算符随做的那样。
参考:《C++ primer》整理笔记