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)代码>将为您提供一个悬而未决的参考。但合理的代码不太可能分配给临时代码,也不可能将分配结果绑定到引用,除非您同时执行这两项操作,否则不会有任何危险。