2011-03-28 10 views
10

可能性の重複:
C++: Life span of temporary arguments?フル表現の境界と一時の寿命

例えば、一時的な変数は、完全な式を評価する際の最後のステップとして破壊していると言われています

bar(foo().c_str()); 

一時的なポインタはバーが戻るまで住んでいるが、何

baz(bar(foo().c_str())); 

用することは、それはまだバーが戻るまで住んでいる、またはバズのリターンがフル式はここで終わりを意味し、 コンパイラは、私は後に破壊オブジェクトをチェックされていますbazが返ってくるが、私はそれに頼ることができるだろうか?

+0

はい、この質問への回答はhttp://stackoverflow.com/questions/4214153/lifetime-of-temporariesの一部である必要があります。コメントを投稿する権利がないため、私は新しい質問をしました。そこではカバーされていない特定の詳細に興味があります。 – Vasaka

答えて

10

一時的な人生は、それらが作成された完全な表現の終わりまでです。 「完全な式」は、別の式の部分式ではない式です。 baz(...)は何の部分式ではありませんしながら、baz(bar(...));

bar(...)は、baz(...)の部分式です。したがって、baz(...)は完全な式であり、この式の評価中に作成されたすべての一時的なものは、baz(...)が返されるまで削除されません。

+2

しかし、そのコンストラクタは特別なケースです(私は90%確信しています)ので、 'baz(X(foo()。c_str()));'では、 'X'はクラスであり引数'baz'は' X'のコンストラクタへの呼び出しです。コンストラクタが終了すると 'c_string'の存続期間が終了します。 –

3

名前から分かるように、完全表現はbaz()の呼び出しを含むすべての式であるため、baz()の呼び出しが返されるまで一時的に存続します。

関連する問題