C++ 类模板 多个模板构造函数如何显示调用

浏览:47日期:2023-03-30

问题描述

先上代码

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) 的。

相关文章: