class obj {
};
obj func() {
return obj();
}
int main() {
obj& o = func(); // possible?
}
値でオブジェクトを返す関数の戻り値の範囲はどのくらいですか? 他の言葉では、この関数が呼び出されたスコープの中で、返された値オブジェクトの参照を取ることは可能ですか?関数の戻り値の範囲
class obj {
};
obj func() {
return obj();
}
int main() {
obj& o = func(); // possible?
}
値でオブジェクトを返す関数の戻り値の範囲はどのくらいですか? 他の言葉では、この関数が呼び出されたスコープの中で、返された値オブジェクトの参照を取ることは可能ですか?関数の戻り値の範囲
を行うことができますはい、あなたは、関数の戻り値への参照をバインドすることができます。これは、返されたオブジェクトの存続期間を参照(グローバルまたは関数ローカルの場合)または現在の関数の終わり(参照がデータ・メンバーの場合)に延長します。
ただし、const
左辺値の参照に一時的な値(プライベート値)をバインドすることはできません。だから、このようなものだ:
obj& o = func(); // illegal, because non-const lvalue ref
const obj& o = func(); // fine, lifetime extended
obj&& o = func(); // fine, lifetime extended
一時的ではないconst参照は使用できません。
あなたは
obj o = func(); // new obj created but copy constructor may be ellided
const obj& o = func(); // lifetime extended
obj&& o = func(); // lifetime extended
「non-const」が無効である理由を説明できますか? – mkmostafa
@mkmostafa:これは、あなたのC++教科書はもちろんのこと、何千もの既存の質問でよくカバーされています。 –
あなたがしかし、一時的に非const参照を取るために、言語によってできる許可されていません:
const obj& o = func();
// or
obj&& o = func();
// or simply
obj o = func();
のconst OBJ&O = FUNC(); //可能であれば – AnatolyS
だから、参考にすることは有効です。コンブラはありますか? – mkmostafa
[const以外の参照は一時オブジェクトにバインドできないのはなぜですか?](http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to -a-temporary-object) – LogicStuff