未调用模板成员的重载构造函数

时间:2012-10-15 16:29:01

标签: c++ c++11

好的,这个让我很生气。我无法弄清楚为什么没有调用构造函数。

以下是代码:

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> >&)的构造函数?

编辑:

此外,它在限制重载的构造函数时不会调用它,参见上文。

1 个答案:

答案 0 :(得分:3)

模板化构造函数永远不会复制构造函数。编译器正在使用复制构造函数在PS<RS<WJ<float>>>中的std::array内构造JV。您没有跟踪代码复制构造函数,因此在JV<T>::JV(T const&)之后没有显示其他消息。