将从函数返回的Rvalue分配给另一个Rvalue

Gre*_*g M 7 c++ rvalue lvalue-to-rvalue c++11

class Test {

public:

    int n1;

};

Test func() {

    return Test();

}

int main() {

    func() = Test();

}
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.如何以及为什么允许这样做?是不确定的行为?如果函数返回一个rvalue,那么如何将rvalue设置为另一个rvalue呢?如果我尝试使用任何原始类型,它会给我一个像我期望的错误.

我知道左值是内存中的一个位置,创建临时左值(rvalue?)并将其赋值给另一个左值的函数也是如此?有人可以解释这种语法的工作原理吗

eer*_*ika 7

函数调用表达式的值类别实际上是rvalue.

实际上,您可能无法在rvalue基元上调用复制赋值运算符.C中rvalues的历史定义实际上是它们可能不在分类左侧的区别.

但是,类的赋值运算符有点不同.他们是正式的会员职能.没有规则可以阻止调用rvalues的成员函数.实际上,当函数具有副作用时,它通常非常有用.

它是如何工作的,好吧,临时调用复制赋值运算符,运算符复制右手参数,改变临时状态.在语句之后,临时对象被丢弃.没有UB,只是毫无意义的复制.

可以通过使用如下参考限定符声明运算符阻止在右值上调用复制赋值:Test& operator=(Test) & = default;.Ref-qualifiers仅在c ++ 11中稍后添加,因此(隐式)复制赋值不能指定为先前的ref-qualified.据推测,C++ 11并没有改变隐式复制构造函数的限定符,以防止破坏分配给rvalue的旧代码,即使这样的赋值似乎毫无意义.在高完整性C++编码标准建议您使用裁判预选赛用户定义的复制赋值运算符.