2

これは、クラスの初期化がどのように機能するかを理解するための私の試みです。私はすべてについて確信が持てないので、この質問をしているのです。これは、次のことを行うときに起こると私が信じていることです。

T t = u;
  1. Tfrom型のオブジェクトを構築しますu。これは次のようになります。

    T t = T(u);
    
  2. コピー コンストラクターを呼び出します。

    T t( T(u) );
    

さて、2番目は私が理解していない部分です。T t = uに作られたどこかで読みましたT t(T(u))。しかし、それが本当なら、なぜこれは「コピーコンストラクタ」を出力しないのですか:

struct T
{
  template <class U>
  T(U) {
     std::cout << "constructs an object of type T...\n";
  }

  T(T const &)
  {
     std::cout << "copy-constructor";
  }

  T& operator=(T const &)
  {
     std::cout << "assignment operator"; return *this;
  }

  T() = default;
};

int main()
{
   T t(T(5));
}

実際には、これが行うのは print が「型 T のオブジェクトを構築する」ことだけです。ここでコピーコンストラクターが呼び出されないのはなぜですか? のコンストラクターに渡されるT(5)タイプのオブジェクトにすることができるため、適切なコンストラクターを呼び出すべきではありません。T const &T

これについての洞察が本当に欲しいです。私はしばらくの間、これを理解しようとしてきました。

4

1 に答える 1

4

この状況には特別なルールがあります。コンパイラは、コピー コンストラクターを使用した式が有効であれば、副作用があってもコピー コンストラクターをスキップできます。そう

T t = u;

あなたが言うように、

T t(T(u));

コンパイラはコピー コンストラクターをスキップし、これを次のように扱います。

T t(u);

これが許可されない状況の 1 つは、プライベート コピー コンストラクターを持つクラスです。その場合、T t(T(u));は正当ではなく、コンパイラはコピー コンストラクターをスキップしてそれを正当にすることはできません。

于 2013-04-07T17:14:09.037 に答える