5

要するに、以下のコードがコメントで説明されているように動作するのはなぜですか?

struct A
{
    A() = delete;
    //A(const A&) {} // uncommenting this...
};

int main()
{
    A a{}; // ... breaks this
    //A(); // this fails in either case because of `A() = delete;` only
}

これを理解するには、標準のどの部分 (または少なくとも cppreference のページ) を見る必要がありますか?

ただし、A(const A&) = default;代わりに書いても壊れ//A(const A&) {} ませんA a{};。これはどうですか?根本的な原因は同じだと思いますが、C++を本当に知っている人の言葉は、私が思っているよりも優れています.

4

2 に答える 2

10

ユーザー提供のコピー コンストラクターがない場合Aは、集計になります。はい、デフォルトのコンストラクターを削除しましたが。これは C++20 で対処されたものです。

したがって、C++20 より前A a{};は、集約初期化であり、削除されたコンストラクターを使用しません。コピー コンストラクターのコメントを外すとA、集約でなくなるため、集約の初期化が値の初期化に変わります。したがって、の初期化でaは、削除されたコンストラクターを呼び出そうとします。

標準から初期化子の意味を推測するために、通常は[dcl.init]/16から開始します。箇条書きを見ていくと、イニシャライザのプロパティ (問題の型のプロパティと一致する場合) が初期化の発生方法にどのように影響するかがわかります。

于 2021-01-13T07:41:28.507 に答える