模板构造函数一个参数const而不是const

时间:2016-12-25 19:41:41

标签: c++ templates copy-constructor

我尝试将模板构造函数与一个参数一起使用。我尝试了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。为什么会这样?

1 个答案:

答案 0 :(得分:1)

  

因此为Foo1生成默认复制构造函数,而不为Foo2生成。

错误。

生成两个复制构造函数,但

template <typename T> Foo2( T& f) // with T = Foo2

是比复制构造函数更好(精确)的匹配,因为您传递的是非const Foo2