2016-01-22 79 views
6

這個模板ctor隱藏移動ctor嗎?具有通用參考的模板構造函數是否隱藏移動構造函數?

class A { 
    public: 
     template<typename T> 
     A(T &&t); 

     // move would be as this: 
     /* 
      A(A &&a); 
     */ 
}; 

那麼在這種情況下應該如何實現移動ctor呢?應該使用默認語法A (A &&)還是模板專業化?

+1

看來,至少在海灣合作委員會,移動時不考慮模板ctor:http://coliru.stacked-crooked.com/a/3c995d34b40fb4bc如果這是根據標準的情況下,那麼你可以實現移動ctor通常的方式。 – user2079303

回答

3

根據標準(草案)

[class.copy]

3甲非模板構造用於類X是移動構造函數,如果它的第一個參數是X型&的&,const X & &,易失性X & &或常量易失性X & &,或者沒有其他參數或者其他所有參數ameter具有默認參數(8.3.6)。 [例如:Y :: Y(Y & &)是一個移動構造函數。

只有非模板構造函數可以移動構造函數。同樣適用於複製構造函數。因此會生成隱式移動構造函數。

以通常的方式實現移動構造函數。專業化將不起作用,因爲重載解析首選隱式非模板移動構造函數。

但是,如果參數類型與const T&不完全匹配,則模板引用將勝出重載解析。這很容易發生,可以從Praveen的例子中看出。

+1

**同樣適用於複製構造函數**。 'a a2 {a1};'調用'template'而不是'copy constructor'。爲什麼? http://ideone.com/JAfjLy – Praveen

+3

@Praveen因爲'a1'不是'const'。轉發引用非常貪婪。 – TartanLlama

5

接受的答案不正確。雖然確實如此:template <typename T> A(T &&t) { }不是移動構造函數,但您已經知道這一點。編譯器將隱式聲明在這種情況下和正常負載分辨率的移動構造函數會按預期工作:

A a{2}; // calls template 
A b = std::move(a); // calls move 
A c{a}; // calls template 

沒有什麼被搬進c排除a是,即使該模板的構造是不是一個「移動」構造函數。

+3

你怎麼知道提問者知道模板不算作移動構造函數?它在接受的答案中說,沒有移動構造函數是隱式聲明的? (或_「接受的答案是不正確的」_是指什麼?) – nwp