C++ 防止分配给右值

C++ 防止分配给右值,c++,operator-overloading,variable-assignment,C++,Operator Overloading,Variable Assignment,假设我有一个具有重写赋值运算符的类: 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(); 对于基元类型,这

假设我有一个具有重写赋值运算符的类:

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限定符。

如果您不希望在临时值(右值)上调用
运算符=()
,则将其限定为左值:

下面

f() = t;

将给出编译错误。

如果不希望在临时值(右值)上调用
运算符=()
,则将其左值限定为:

下面

f() = t;

将给出编译错误。

在C++11中,可以对赋值运算符进行ref-qualified,以便只能对左值引用调用赋值运算符。然而,我在标准中找不到任何关于这样一个操作符是否仍然是复制赋值操作符的明确信息

在C++03中,人们提出了只从函数返回常量对象的想法,但这是一个坏主意,因为它阻止在C++11中移动


最后,可能不值得为此付出任何努力。

在C++11中,您可以对赋值运算符进行ref-qualified,以便只能在左值引用中调用它。然而,我在标准中找不到任何关于这样一个操作符是否仍然是复制赋值操作符的明确信息

在C++03中,人们提出了只从函数返回常量对象的想法,但这是一个坏主意,因为它阻止在C++11中移动


最后,可能不值得为此付出任何努力。

Make f()return
const Test
?Make f()return
const Test
?@Jarod42:是的。C++11发布至今已有两年多了。所以我假设C++ 11是默认的,除非特别指定。这是一个很好的回答我问的问题,但是我忘了提到我使用Visual C++不支持这些。在这种情况下,您现在没有任何理想的解决方案。无论如何,我会保留这个答案作为教育目的,因为它可能会帮助其他人@纳瓦兹:这不太现实。新版本的标准要广泛可靠地实施通常至少需要5年时间。@Jarod42:是的。C++11发布至今已有两年多了。所以我假设C++ 11是默认的,除非特别指定。这是一个很好的回答我问的问题,但是我忘了提到我使用Visual C++不支持这些。在这种情况下,您现在没有任何理想的解决方案。无论如何,我会保留这个答案作为教育目的,因为它可能会帮助其他人@纳瓦兹:这不太现实。新版本的标准通常需要至少5年的时间才能广泛可靠地实施。