2013-10-03 198 views
14

我讀過該模板copy-con永遠不會默認複製onstructor,並且模板assignment-op從不是複製賦值運算符。模板類的複製構造函數

我不明白爲什麼需要這個限制,並且馬上去網上ideone並返回一個test program但這裏拷貝構造函數不會被調用關於進一步google搜索,我碰到了模板的構造和嘗試,但仍然是永遠不會調用拷貝構造函數。

#include <iostream> 
using namespace std; 

template <typename T> class tt 
{ 
    public : 
    tt() 
    { 
     std::cout << std::endl << " CONSTRUCTOR" << std::endl; 
    } 
    template <typename U> const tt<T>& operator=(const tt<U>& that){std::cout << std::endl << " OPERATOR" << std::endl;} 
    template <typename U> tt(const tt<U>& that) 
    { 
     std::cout << std::endl << " COPY CONSTRUCTOR" << std::endl; 
    } 
}; 


tt<int> test(void) 
{ 
    std::cout << std::endl << "  INSIDE " << std::endl; tt<int> a; return a; 
} 

int main() { 
    // your code goes here 
    tt<int> a ; a = test(); 

    return 0; 
} 

有人可以解釋我背後的全部原因,以及如何編寫模板類的複製構造函數。

感謝

+2

[Copy-elision。](http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) – 0x499602D2

+1

沒有「默認拷貝構造函數」。只有*一個*拷貝構造函數。模板從來就不是。 –

+0

我編輯的代碼,並在ideone中運行它,但仍然複製構造函數不會被調用。但我也無法理解這個限制背後的原因 – anonymous

回答

18

有嚴格的規定什麼是拷貝構造函數(見C++ 11,12.8):

  • 它不是一個模板。

  • 對於一類T,它的第一個參數必須具有類型T &T const &T volatile &T const volatile &

  • 如果它有多個參數,其他參數必須有默認值。

如果你不聲明拷貝構造函數,形式T::T(T const &)的拷貝構造函數是隱式聲明你。 (它可能實際上也可能不實際定義,如果它被定義,它可能被定義爲刪除。)

(通常的重載決策規則意味着最多可以有四個拷貝構造函數,每個CV資格)

移動構造函數有類似規則,其中&&代替&

17

我不能,爲什麼這是怎麼回事,但在這裏評論是你如何寫一個類模板拷貝構造函數和賦值操作符:

template <class T> 
    class A 
    { 
     public: 
     A(const A &){} 
     A & operator=(const A& a){return *this;} 
    }; 

,就是這樣。
這裏的訣竅是,即使A是一個模板,當您在類內引用它爲A(例如在函數簽名中)時,它將被視爲完整類型A<T>

+1

我發現使用A(const A &){}沒有給出錯誤... – Daniel

+4

@Daniel這是因爲'A '也指類的完整類型, 'A'只是你可以在課堂上使用的簡寫。 – SirGuy

+0

@NicolaiNita這不是說這裏第一個評論是什麼意思嗎? – SirGuy