getx()
関数が返す一時オブジェクトへの非 const 参照を取得できないのはなぜですか? 明らかに、これは C++ 標準で禁止されていますが、標準への参照ではなく、そのような制限の目的に興味があります。
struct X
{
X& ref() { return *this; }
};
X getx() { return X();}
void g(X & x) {}
int f()
{
const X& x = getx(); // OK
X& x = getx(); // error
X& x = getx().ref(); // OK
g(getx()); //error
g(getx().ref()); //OK
return 0;
}
- オブジェクトへの定数参照はC++ 標準で禁止されていないため、オブジェクトの有効期間が原因ではないことは明らかです。
- 非定数関数の呼び出しが許可されているため、上記のサンプルでは一時オブジェクトが定数でないことは明らかです。たとえば
ref()
、一時オブジェクトを変更できます。 - さらに
ref()
、コンパイラをだましてこの一時オブジェクトへのリンクを取得できるようにすることで、問題を解決できます。
加えて:
彼らは、「一時オブジェクトをconst参照に割り当てると、このオブジェクトの寿命が延びる」と「非const参照については何も言われていない」と言います。私の追加の質問です。次の割り当ては、一時オブジェクトの有効期間を延長しますか?
X& x = getx().ref(); // OK