私の c++ の本 (lippman、c++ 入門書、第 5 版、p. 508) では、コンパイラがいつコピー コントロールと既定のコンストラクターを削除されたメンバーとして合成するかを判断するための次の 4 つの規則を提供しています。
合成されたデストラクタは、削除された、またはアクセスできない (private などの) デストラクタを持つメンバーがクラスにある場合、削除済みとして定義されます。
クラスに、独自のコピー コンストラクターが削除されているかアクセスできないメンバーがある場合、合成されたコピー コンストラクターは削除済みとして定義されます。クラスに、削除されたデストラクタまたはアクセスできないデストラクタを持つメンバーがある場合も削除されます。
メンバーに削除された、またはアクセスできないコピー代入演算子がある場合、またはクラスに const または参照メンバーがある場合、合成されたコピー代入演算子は削除済みとして定義されます。
クラスに、削除された、またはアクセスできないデストラクタを持つメンバーがある場合、合成された既定のコンストラクタは削除済みとして定義されます。または、クラス内初期化子を持たない参照メンバーがあります。または、既定のコンストラクターを明示的に定義しない型の const メンバーがあり、そのメンバーにはクラス内初期化子がありません。
これらのルールがここで 2 番目のエラーをどのように説明しているかわかりません。
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;
}
最初のエラーは理解できるものであり、この質問とは直接関係ありません。2 番目のエラーは驚くべきものです。なぜなら、上記の規則では、Bar が削除済みとして合成されたデフォルト コンストラクターを取得する必要がある理由を説明していないからです。
私の本に欠けているルールは何ですか、またはルールを理解していませんか?