从临时变量返回的引用是否有效?

Is a reference returned from a temporary variable valid?

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

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;
    }
}

但是,我不确定临时变量是否会保持足够长的时间以供 draw() 函数使用它。这样做安全吗?

是的,临时 Quad 在完整表达式的末尾被销毁(尾随 ;)。所以当你在它上面调用 rotate 时它仍然存在,当你用它作为参数调用 draw 时它仍然存在。

这种特殊用途是安全的。临时文件持续到创建它的完整表达式结束;在这里,完整表达式是整个语句,包括对 draw.

的调用

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

Quad & rotated = Quad(0, 0, 1, 1).rotate(90);
draw(rotated);

在我看来,我更希望类型是不可变的;与其调用函数来修改现有对象,不如调用 const 函数来 return 新对象,同时保持现有对象不变。

除非它直接绑定到一个引用,这会延长它的生命周期以匹配引用。这在这里不适用,因为它没有直接绑定。