我尝试将模板构造函数与一个参数一起使用。我尝试了2个const参数和非const。
class Foo1
{
public:
Foo1() {}
template <typename T>
Foo1(const T& f)
{
cout<<"Foo1"<<endl;
}
};
class Foo2
{
public:
Foo2() {}
template <typename T>
Foo2( T& f)
{
cout<<"Foo2"<<endl;
}
};
int main()
{
Foo1 f1;
Foo1 f11(f1);
Foo2 f2;
Foo2 f21(f2);
}
输出是: foo2的
因此为Foo1生成默认复制构造函数,而不为Foo2生成。
当我将主要功能更改为:
int main()
{
const Foo1 f1;
Foo1 f11(f1);
const Foo2 f2;
Foo2 f21(f2);
}
输出为空:
所以这两个副本都是geerated。为什么会这样?
答案 0 :(得分:1)
因此为Foo1生成默认复制构造函数,而不为Foo2生成。
错误。
生成两个复制构造函数,但
template <typename T> Foo2( T& f) // with T = Foo2
是比复制构造函数更好(精确)的匹配,因为您传递的是非const
Foo2
。