3

私はこれを読んでいました: 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;これは、が宣言されている場合、「デフォルト」であってもユーザー宣言と見なされることを意味すると思いますか?

4

1 に答える 1