2016-12-25 77 views
1

我尝试使用具有一个参数的模板构造函数。我尝试了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); 
} 

输出是:对于Foo1而不是foo2的产生 foo2的

所以默认的拷贝构造函数。

当我改变主要功能:

int main() 
{ 
    const Foo1 f1; 
    Foo1 f11(f1); 
    const Foo2 f2; 
    Foo2 f21(f2); 
} 

输出是空的:

因此两个拷贝构造被geerated。为什么是这种行为?

回答

1

因此为Foo1生成默认拷贝构造函数,而不是为Foo2生成默认拷贝构造函数。

错误。

生成构造这两个副本,但

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

是一个更好的(精确)匹配不是拷贝构造函数,当你经过一个非constFoo2

相关问题