2014-01-31 121 views
1

說我有一類被覆蓋的賦值操作符:防止分配給右值

class Test 
{ 
public: 
    Test& operator =(const Test&) {return *this;} 
}; 

Test f(); 

有沒有什麼辦法讓它編譯時錯誤分配給一個函數的結果?

例子:

f() = test(); 

Test t; 
f() = t; 

// if there were also a Test Test::operator+(Test); 
(t + t) = test(); 

這已經發生了基本類型,我想將它複製該類:

int g(); 
g() = 5; // error 
(3 + 4) = 5; // error 

編輯:我使用Visual C++,這不支持所有的C++ 11。具體來說,它不支持ref-qualifiers。

+0

讓f()返回'const Test'? – ddemidov

回答

6

如果你不希望你的operator=()對臨時量(右值)被調用做,然後限定它左值爲:

Test& operator =(const Test&) & {return *this;} 
          //^^^ note this 

現在下面

f() = t; 

會給編譯錯誤。

+0

它需要C++ 11 – Jarod42

+1

@ Jarod42:是的。自C++ 11發佈以來已經有2年多的時間了。所以我會假設C++ 11現在是默認的,除非特別說明。 – Nawaz

+0

對於我所問的問題,這是一個很好的答案,但我忘記提及我正在使用不支持這些的Visual C++。 – immibis

0

在C++ 11中,您可以引用您的賦值運算符的限定,以便它只能在左值引用上調用。但是,在標準中我找不到關於這樣一個運營商是否還在複製賦值運算符中的任何明確信息。

在C++ 03中,人們提出了僅從函數返回const對象的想法,但這是一個壞主意,因爲它阻止了在C++ 11中的移動。

最後,這可能不值得去做任何努力。