C++ 从临时变量返回的引用有效吗?

C++ 从临时变量返回的引用有效吗?,c++,chaining,object-lifetime,C++,Chaining,Object Lifetime,我遇到了一种情况,能够将方法调用链接到临时变量将非常有用: draw(Quad(0, 0, 1, 1).rotate(90)); // <-- .rotate() returns a Quad reference struct Quad{ Quad(float x, float y, float width, float height){...} Quad & rotate(float degrees){ ... return *

我遇到了一种情况,能够将方法调用链接到临时变量将非常有用:

draw(Quad(0, 0, 1, 1).rotate(90));  // <-- .rotate() returns a Quad reference

struct Quad{
    Quad(float x, float y, float width, float height){...}
    Quad & rotate(float degrees){
        ...
        return *this;
    }
}

绘制(四边形(0,0,1,1)。旋转(90));// 是的,临时的
四元组
在完整表达式的末尾被销毁(尾随
)。因此,当您在其上调用
rotate
时,它仍然处于活动状态,当您将其作为参数调用
draw
时,它仍然处于活动状态。

此特定用途是安全的。临时表达式持续到创建它的完整表达式结束†;这里的完整表达式是整个语句,包括对
draw
的调用

一般来说,这种模式可能是危险的。以下给出了未定义的行为:

Quad & rotated = Quad(0, 0, 1, 1).rotate(90);
draw(rotated);
在我看来,我更喜欢类型是不可变的;与其调用函数修改现有对象,不如调用
const
函数返回新对象,保持现有对象不变


†除非其直接绑定到引用,从而延长其生存期以匹配引用。这不适用于这里,因为它不是直接绑定的。

我更喜欢你的答案,因为你确实给出了一个关于如何编写更好的类的具体建议,这是我无法做到的。让我们和你的一起去吧。:)我同意。但是,赋值运算符的约定不是同样的模式吗?如果这个模式是危险的,那么这是否意味着赋值运算符也因为同样的原因是危险的?@ChrisDrew:是的,传统的类赋值运算符也返回引用,所以有些奇怪的东西,比如
T&T=(T()=x)将为您提供一个悬而未决的参考。但合理的代码不太可能分配给临时代码,也不可能将分配结果绑定到引用,除非您同时执行这两项操作,否则不会有任何危险。