2013-07-12 223 views
1

在C++中爲類定義運算符賦值時,我注意到您不需要返回* this。我在Visual Studio 2012,Visual Studio 2010中測試了這個警告級別爲4,並且沒有錯誤或警告,並且代碼按預期工作。但在Visual Studio 2008中,我收到了一個編譯時錯誤,說'操作符=必須返回一個值'。C++賦值運算符默認返回

我的問題是:是這樣的「功能」除了核心的C++語言,或者是它的東西是,森林狼隊決定在添加

,如果這已問我道歉或有信息。這在線上,我無法找到任何答案。

template <typename T> 
struct singleton 
{ 
T value; 

singleton(const singleton& x) : value(x.value) {} 
singleton() {} 
~singleton() {} 
singleton& operator=(const singleton& x) { value = x.value; } 
}; 

這是我用於測試的代碼:

singleton<float> sf; 
sf.value = 1.9f; 
singleton<float> sf2 = sf; 
std::cout << sf2.value << std::endl; 
+0

您是否有示例? – 0x499602D2

+1

你有'singleton&'作爲返回值,但不返回任何內容。 – Rapptz

+0

@Rapptz我知道,但它似乎是合法的VS2012即使有警告級別4 – user2574802

回答

2

在你的例子中,你的問題來自函數返回singleton&,但是你實際上並沒有返回任何東西(即*this)。該標準認爲這是未定義的行爲。

節6.6.3.2

流動ÔFF的函數的結束相當於沒有 值的回報;這會導致函數返回函數中的未定義行爲

+0

謝謝,我明白我只是覺得奇怪,我沒有收到任何警告/錯誤。 – user2574802

+0

可能值得注意的是,AFAIK,賦值運算符不需要*返回任何東西。它可以是一個「空白」方法。但是,這會禁用像'a = b = c = d;'這樣的用法 – yzt

0

這是返回非空到有沒有返回值的函數未定義的行爲。這可能是允許的,但並不意味着它符合標準。

+0

謝謝,我認爲這將是很好的簡約代碼,只是想檢查標準對此所說的話。 – user2574802