私はこれを読んでいました: https://en.cppreference.com/w/cpp/language/rule_of_three
そして、これからの私の理解は、仮想デストラクタを持つ基本クラスが必要な場合は、5 つの特殊関数 (0 セクションのルールから抽出) をすべて定義する必要があるということです。
class base_of_five_defaults
{
public:
base_of_five_defaults(const base_of_five_defaults&) = default;
base_of_five_defaults(base_of_five_defaults&&) = default;
base_of_five_defaults& operator=(const base_of_five_defaults&) = default;
base_of_five_defaults& operator=(base_of_five_defaults&&) = default;
virtual ~base_of_five_defaults() = default;
};
ただし、そのクラスをインストールしようとすると、「デフォルトの c'tor が作成されていません」というエラーが表示されます。
base_of_five_defaults b; // Error
次に、デフォルトを生成すればOKです:
base_of_five_defaults() = default;
しかし、これが必要であることをまったく理解していなかったので、なぜそこにないのか混乱しています。コンパイラがデフォルトのコンストラクターを生成しない唯一の理由は、デフォルト以外のコンストラクターを指定した場合だと思いました...
デフォルトの c'tor を指定する必要がある場合、例のクラスは構築できません。これは奇妙に思えます。
これが私の完全なライブ例へのリンクです: https://godbolt.org/z/qPvjd6r51
https://en.cppreference.com/w/cpp/language/default_constructorから:
暗黙的に宣言されたデフォルト コンストラクター
クラス型 (構造体、クラス、または共用体) に対してユーザーが宣言した任意の種類のコンストラクターが提供されていない場合、コンパイラは常に、既定のコンストラクターをそのクラスのインライン パブリック メンバーとして宣言します。
base_of_five_defaults(const base_of_five_defaults&) = default;
これは、が宣言されている場合、「デフォルト」であってもユーザー宣言と見なされることを意味すると思いますか?