从临时变量返回的引用是否有效?
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 新对象,同时保持现有对象不变。
†除非它直接绑定到一个引用,这会延长它的生命周期以匹配引用。这在这里不适用,因为它没有直接绑定。
我遇到过一种情况,能够将方法调用链接到临时变量会非常有用:
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 新对象,同时保持现有对象不变。
†除非它直接绑定到一个引用,这会延长它的生命周期以匹配引用。这在这里不适用,因为它没有直接绑定。