问题描述
先上代码
template <typename T>class A{public: A() {cout << 'A()' << endl; } A(const A& a) {cout << 'A(const A& a)' << endl; } template <typename U, typename... Args> A(U & f, Args... arg) {cout << 'A(U & f, Args... arg)' << endl; }};int main(){ A<int> a; //A() A<int> b(a); //A(U & f, Args... arg) return 0;}
如果修改一下
template <typename U, typename... Args>A(U f, Args... arg){ cout << 'A(U & f, Args... arg)' << endl;}
那么输出就变成了想要的方式了。
A()A(const A& a)
为什么构造对象b的时候会调用A(U & f, Args... arg)这个模板函数,而不是调用拷贝构造函数?
应该如何指定调用的构造函数?
问题解答
回答1:这个应该和C++选择重载函数的顺序有关,对于一个类型 T 的实参,优先选择 T&,然后才是 const T& 吧。所以如果你把代码修改成:
template <typename U, typename... Args>A(const U& f, Args... arg){ cout << 'A(const U & f, Args... arg)' << endl;}
它也会先执行 A(const A& a) 的。