2015-10-27 87 views
1

有可能是賦值運算符可以推導出成員函數模板的一個特例?拷貝構造函數作爲模板成員函數被忽略

例如,我有一個布爾參數類模板,並希望實現分配運算模板實參不管在任何特定值。

#include <iostream> 

template<bool sw> 
struct A { 
    A() { 
     std::cout << __PRETTY_FUNCTION__ << '\n'; 
    } 

    template<bool input_sw> 
    A & operator = (const A<input_sw> &a) { 
     std::cout << __PRETTY_FUNCTION__ << '\n'; 
     return *this; 
    } 
}; 

int main() 
{ 
    A<true> a; 
    A<true> b; 
    a = b; 
} 

在代碼片段上面鐺和gcc編譯的二進制文件打印出任何關於分配 - 據我可以告訴默認分配在這裏產生的可能性,儘管從模板中推斷出這一點。

+0

複製賦值運算符是一個非模板函數。仍然有一個隱式生成的複製賦值操作符在您的代碼中調用。這對寫入的內容是有利的,因爲非模板函數優於模板函數。 – 0x499602D2

回答

6

他們不打印任何東西是正確的。正在發生的事情是,有對A<true>與此簽名創建隱含拷貝賦值運算符:

A<true>& operator=(const A<true>&); 

因此,當我們做重載決議,有兩種可行的候選人:

A<true>& operator=(const A<true>&);  // implicit copy assignment 
A<true>& operator=(const A<input_sw>&); // [ with input_sw = true ] 

兩個運營商採用相同的論點(const A<true>&),所以從這個角度看它們是同等優秀的候選人。但是非模板函數優先於函數模板專門化,這使得隱式拷貝賦值操作符成爲可行的候選者。


現在,考慮一種替代方案。如果你宣佈你的操作模板是這樣的:

template<bool input_sw> 
A & operator =(A<input_sw> &a) { ... } 

也就是說,並不是const。這不是很好的做法,我只是爲了說明的目的而提出這一點。在這種情況下,我們的兩位候選人a=b是:

A<true>& operator=(const A<true>&); // implicit copy assignment 
A<true>& operator=(A<input_sw>&);  // [ with input_sw = true ] 

現在兩位候選人做採取同樣的說法。我們的操作員模板需要參考非const。在兩個參考文獻的情況下,最優選最後一個參考文獻,其在此情況下將是操作者。放棄const,現在你的功能是首選,你會看到打印的東西。

C++是最好的。

+0

我想,明確刪除默認賦值操作符不會有幫助嗎?是否有可能從重載分辨率中刪除默認的? –

+0

@AlexanderSergeev編號如果存在隱式賦值運算符,它將被默認或刪除。 – Barry

+0

@AlexanderSergeev將賦值邏輯放置在模板化成員函數中,並將兩個運算符重定向到它。或者你可以設計這樣的類,使默認賦值運算符的確是正確的嗎? –