0

わかりました、これは私を怒らせます。コンストラクターが呼び出されない理由がわかりません。

コードは次のとおりです。

template<class T>
struct JV {
  JV() {}
  JV(const T& t0) : F{{t0}} {
    std::cout << __PRETTY_FUNCTION__ << "\n";
  }
  std::array<T,1> F;
};


template<class T>
struct RS : public JV<T>
{
  RS(): JV<T>() {}

  RS(const T& rhs) : JV<T>(rhs) {
    std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};



template<class T>
struct PS : public JV<T>
{
  PS(): JV<T>() {}

  PS(const T& rhs) : JV<T>(rhs) {
    std::cout << __PRETTY_FUNCTION__ << "\n";
  }
};


template<class T>
struct WJ
{
  WJ() {
    std::cout << "WJ::WJ()\n";
  }
};


int main() {
  PS<RS<WJ<float> > > wj;
  std::cout << "go for it\n";
  PS<PS<RS<WJ<float> > > > copy(wj);
}

GCC g++ 4.7.2-std=c++0xでコンパイルして実行すると、出力は次のようになります。

WJ::WJ()
go for it
JV<T>::JV(const T&) [with T = PS<RS<WJ<float> > >]
PS<T>::PS(const T1&) [with T1 = PS<RS<WJ<float> > >; T = PS<RS<WJ<float> > >]

JV<T>::JV(const T&) [with T = PS<RS<WJ<float> > >]のオーバーロードされたコンストラクターを呼び出さないのはなぜPS<RS<WJ<float> > >::PS<RS<WJ<float> > >(const RS<WJ<float> >&)ですか?

編集:

また、オーバーロードされたコンストラクターを制限するときは呼び出しません。上記を参照してください。

4

1 に答える 1

3

テンプレート化されたコンストラクターは、コピー コンストラクターではありません。コンパイラは、コピー コンストラクターを使用してinPS<RS<WJ<float>>>内に構築しています。コード コピー コンストラクターで追跡していないため、 の後に他のメッセージは表示されません。std::arrayJVJV<T>::JV(T const&)

于 2012-10-15T16:33:56.423 に答える