2015-04-20 41 views
1

參考http://en.cppreference.com/w/cpp/language/as_operator的頁面,複製賦值運算符(在編譯器需要時並且可能的時候自動生成)將返回自身類型的左值引用。對於重載操作符=返回無效是否是複製操作符?

所以,當我定義一個重載的操作如下,

void operator=(T& t) 

是否還有機會編譯器將隱式地定義一個默認的拷貝賦值運算符?

+3

返回類型不被認爲是函數簽名的一部分,所以我期望不是 – EdChum

+5

爲什麼你會使返回無效?如果你這樣做,你不能做像'foo a = b = c = d = some_val;' – NathanOliver

+7

@NathanOliver:那會是件壞事? –

回答

2

這是一個拷貝賦值運算符,如語言標準所規定的,在C++ 11 [class.copy]/17:

甲用戶聲明的複製賦值運算符X::operator=X類的非靜態的非模板成員函數X類型,X&const X&volatile X&的正好一個參數或const volatile X&

返回類型不影響它是否被認爲是複製賦值操作符。它隻影響你可以用賦值表達式的結果做什麼。

+0

所以,沒有(標題)和是(正文)。 –

1

C++ Reference(當你發現自己)聲明:

如果提供了一個類類型(結構,類或聯合)沒有用戶定義的複製賦值運算符,編譯器將始終聲明一個作爲該班級的內聯公共成員。

類T的拷貝賦值運算符是與該名操作者的非模板非靜態成員函數=在於採用類型T,T &,常量Ť&的正好一個參數,揮發性牛逼&或const volatile牛逼&

所以,換句話說:只要你聲明自己的拷貝賦值運算符(這需要一件T &參數),編譯器不會添加隱式的。

總還是有問題,爲什麼返回void但是...(C++編碼規範建議返回引用自己)

+0

因此,它取決於用戶定義的'void operator =(T&t)'是否符合複製賦值運算符或非複製賦值運算符的條件,但是您不回答它們中的哪一個。 (你的鏈接也會回答這個問題,所以你可以在你的答案中多加一點。) – hvd

+0

@ hvd相應地更新了答案......謝謝指出。 – Daniel

+0

我不明白你如何從這兩個引語中得出結論(儘管我並不是說結論是錯誤的)。第一個特別沒有說什麼會導致編譯器*不生成隱式賦值運算符。它只提供了一個條件,可以保證*會生成一個。並沒有說明是否還有其他可能滿足的條件。 –