我遇到的情况是能够将方法调用链接到临时变量会非常有用:
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()
函数使用它。这样做安全吗?
答案 0 :(得分:12)
这种特殊用途是安全的。暂时持续到创建它的完整表达式结束†;在这里,full-expression是整个语句,包括对draw
的调用。
一般来说,这种模式可能很危险。以下给出了未定义的行为:
Quad & rotated = Quad(0, 0, 1, 1).rotate(90);
draw(rotated);
在我看来,我更喜欢这种类型是不可改变的;而不是调用函数来修改现有对象,调用const
函数返回一个新对象,保持现有对象不变。
†除非将直接绑定到引用,否则会延长其生命周期以匹配引用。这不适用于此,因为它不直接绑定。
答案 1 :(得分:6)
是的,临时Quad
在完整表达式结尾处被销毁(尾随;
)。因此,当您在其上调用rotate
时它仍然存在,并且当您使用draw
作为参数调用时,它仍然存在。