2016-05-06 21 views
3
class obj { 
}; 

obj func() { 
    return obj(); 
} 

int main() { 
    obj& o = func(); // possible? 
} 

値でオブジェクトを返す関数の戻り値の範囲はどのくらいですか? 他の言葉では、この関数が呼び出されたスコープの中で、返された値オブジェクトの参照を取ることは可能ですか?関数の戻り値の範囲

+2

のconst OBJ&O = FUNC(); //可能であれば – AnatolyS

+0

だから、参考にすることは有効です。コンブラはありますか? – mkmostafa

+1

[const以外の参照は一時オブジェクトにバインドできないのはなぜですか?](http://stackoverflow.com/questions/1565600/how-come-a-non-const-reference-cannot-bind-to -a-temporary-object) – LogicStuff

答えて

2

を行うことができますはい、あなたは、関数の戻り値への参照をバインドすることができます。これは、返されたオブジェクトの存続期間を参照(グローバルまたは関数ローカルの場合)または現在の関数の終わり(参照がデータ・メンバーの場合)に延長します。

ただし、const左辺値の参照に一時的な値(プライベート値)をバインドすることはできません。だから、このようなものだ:

obj& o = func(); // illegal, because non-const lvalue ref 
const obj& o = func(); // fine, lifetime extended 
obj&& o = func(); // fine, lifetime extended 
2

一時的ではないconst参照は使用できません。

あなたは

  • obj o = func(); // new obj created but copy constructor may be ellided
  • const obj& o = func(); // lifetime extended
  • obj&& o = func(); // lifetime extended
+1

「non-const」が無効である理由を説明できますか? – mkmostafa

+0

@mkmostafa:これは、あなたのC++教科書はもちろんのこと、何千もの既存の質問でよくカバーされています。 –

1

あなたがしかし、一時的に非const参照を取るために、言語によってできる許可されていません:

const obj& o = func(); 
// or 
obj&& o = func(); 
// or simply 
obj o = func();