2016-12-25 59 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

相關問題