2011-10-19 2 views
2

以下のコメント行の実行順序は保証されていますか?私のコンパイラでカンマ区切り文での戻り値の有効期間

struct S 
{ 
    S() { /* called 1st */ } 
    ~S() { /* called 3rd */ } 
}; 

boost::shared_ptr<S> f() 
{ 
    return boost::shared_ptr<S>(new S); 
} 

int second() { return 0; /* called 2nd */ } 

int test() 
{ 
    return (f(), second()); 
} 

f()によって返さshared_ptrsecond()が呼び出された後まで持続しているようです。しかしこれは標準のコンパイラによって保証されていますか?

+0

[一時的な生涯]の可能な複製(http://stackoverflow.com/questions/4214153/lifetime-of-temporaries) – fredoverflow

答えて

7

はい

一時停止は、full-expressionの完了まで続きます。

[n3290: 12.2/3]:実装は非自明なコンストラクタ(12.1、 12.8)を有するクラスの一時的 オブジェクトを導入

、それはコンストラクタが一時的オブジェクトに対して呼び出されることを保証しなければなりません。同様に、デストラクタは一時的に デストラクタ(12.4)で呼び出されます。一時オブジェクトは、 として完全表現(1.9)を評価する最後のステップとして(字句的に) が作成されたポイントを含むように破棄されます。たとえその 評価が終了しても例外がスローされても、これは当てはまります。 値の計算と一時オブジェクトを破棄する副作用の は、 という特定の部分式ではなく完全表現にのみ関連しています。

そして:

[n3290: 1.9/10]:フル式は他の式の 部分式ではない式です。言語構成が で、関数の暗黙的な呼び出しを生成するように定義されている場合は、 言語構成の使用は、この定義の目的のための式とみなされます。一時オブジェクト以外のオブジェクトの寿命が の終わりに生成されたデストラクタへの呼び出しは、暗黙的な 完全な式です。 の式の結果に適用される変換では、式が表示される の言語構成の要件を満たすためにも、 完全表現の一部とみなされます。 [..]

これは実行が、後者の評価結果とtest()から戻るまでf()second()の両方が存在するべきであることを意味します。

関連する問題