返回对该对象的引用通常用于 赋值运算符重载。它还用作 命名参数习惯用法 的基础,它允许通过对 setter 方法的调用链来初始化对象: Params().SetX(1).SetY(1)
每个都返回对 *this 的引用。
但是返回对 *this
的引用是否正确。如果我们为临时对象调用返回对 this 的引用的方法会怎样:
#include <iostream>
class Obj
{
public:
Obj(int n): member(n) {}
Obj& Me() { return *this; }
int member;
};
Obj MakeObj(int n)
{
return Obj(n);
}
int main()
{
// Are the following constructions are correct:
std::cout << MakeObj(1).Me().member << std::endl;
std::cout << Obj(2).Me().member << std::endl;
Obj(3).Me() = Obj(4);
return 0;
}
原文由 anton_rh 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,退回 *this 是安全的。最简单的情况是,这不是暂时的,但即使是,这也应该是可能的:
换句话说,在你到达分号之前,一切都应该没问题(理论上)。
所以下面的代码应该可以工作:
虽然这不应该工作:
这是合乎逻辑的,因为您正在返回对临时的引用。大多数编译器都会对此发出警告/错误,但如果您的代码变得复杂,则需要注意这一点。
就个人而言,我会阻止在临时对象上调用这些方法来强制 API 用户考虑对象的生命周期。这可以通过重载您的方法来完成:(如果您的编译器已经支持它)