わかりました、これは私を怒らせます。コンストラクターが呼び出されない理由がわかりません。
コードは次のとおりです。
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> >&)
ですか?
編集:
また、オーバーロードされたコンストラクターを制限するときは呼び出しません。上記を参照してください。