このオブジェクトへの参照は、assignment operator overloadingでよく使用されます。これは、named parameters idiomのベースとしても使用され、setterメソッドへの呼び出しのチェーンごとにオブジェクトを初期化することができます。Params().SetX(1).SetY(1)
それぞれが* 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;
}
これらの両方の使用は安全です。この問題は、呼び出し元のコードが現在の文より長い参照を保持しようとした場合にのみ発生します。 'auto&ref = MakeObj(5).Me();'。はい、あなたは一時的なオブジェクトをこのように指定する左辺値を作成することができます(これは、用語「一時オブジェクト」と「右辺値」を交換可能に使用する人々をよく訂正する1つの理由です)。 –
標準ライブラリでも* ://www.cplusplus.com/reference/vector/vector/operator=/: "戻り値:* this"標準ライブラリが誤った構造を使用すると、それは不思議です。 :) –