2014-01-31 82 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中的移动。

最后,这可能不值得去做任何努力。