一時オブジェクトへの非const参照の取得が許可されないのはなぜgetx()
ですか、どの関数が返しますか?明らかに、これは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