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

时间:2015-02-18 11:27:15

标签: 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 *this;
    }
}

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

2 个答案:

答案 0 :(得分:12)

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

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

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

在我看来,我更喜欢这种类型是不可改变的;而不是调用函数来修改现有对象,调用const函数返回一个新对象,保持现有对象不变。

除非将直接绑定到引用,否则会延长其生命周期以匹配引用。这不适用于此,因为它不直接绑定。

答案 1 :(得分:6)

是的,临时Quad在完整表达式结尾处被销毁(尾随;)。因此,当您在其上调用rotate时它仍然存在,并且当您使用draw作为参数调用时,它仍然存在。