我的 c++ 书(lippman,c++ Primer,第五版,第 508 页)提供了这 4 条规则,用于确定编译器何时将复制控件和默认构造函数合成为已删除的成员:
如果类有一个成员,其自己的析构函数被删除或不可访问(例如私有),则合成析构函数被定义为已删除。
如果类有一个其自己的复制构造函数被删除或不可访问的成员,则合成的复制构造函数被定义为已删除。如果该类的成员具有已删除或不可访问的析构函数,它也会被删除。
如果成员具有已删除或不可访问的复制分配运算符,或者如果类具有 const 或引用成员,则合成的复制分配运算符被定义为已删除。
如果类的成员具有已删除或不可访问的析构函数,则合成的默认构造函数被定义为已删除;或者有一个没有类内初始化器的引用成员;或者有一个 const 成员,其类型没有显式定义默认构造函数,并且该成员没有类内初始化程序。
我看不到这些规则如何在这里解释第二个错误:
class Foo {
public:
Foo(int i) { }
};
class Bar {
private:
Foo foo;
};
int main() {
Foo foo; //error: no matching constructor in Foo
Bar bar; //error: implicitly deleted constructor in Bar
return 0;
}
第一个错误是可以理解的,和这个问题没有直接关系。第二个错误令人惊讶,因为上述规则没有解释为什么 Bar 应该将其默认构造函数合成为已删除。
我的书缺少什么规则,或者我没有掌握规则?