2

以下の 3 つのコメント行の実行順序は保証されていますか?

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());
}

私のコンパイラでは、shared_ptr返された byは afterが呼び出されるf()まで持続するようです。second()しかし、これは標準、つまり他のコンパイラによって保証されていますか?

4

1 に答える 1

7

はい

一時的なものは、full-expression.

[n3290: 12.2/3]:実装が自明でないコンストラクタ (12.1、12.8) を持つクラスの一時オブジェクトを導入する場合、一時オブジェクトに対してコンストラクタが呼び出されることを保証する必要があります。同様に、非自明なデストラクタ (12.4) を使用して一時的にデストラクタを呼び出す必要があります。一時オブジェクトは、それらが作成されたポイントを (レキシカルに) 含む完全な式 (1.9) を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。値の計算と一時オブジェクトの破棄の副作用は、特定の部分式ではなく、完全な式にのみ関連付けられます。

と:

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

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

于 2011-10-19T11:14:47.287 に答える