0

自動保存期間を持つ 2 つのオブジェクトがあるとします。

{
   ClassA objA(...);
   ClassB objB(...);

   // [A] code that uses objA and objB.

   // [B] objA is no longer used after this point.

   // ... more code ...

}  // [C] objA and objB go out of scope.
  1. C++ 標準は、objAおよびのコンストラクターの相対的な順序付けを指定していますobjBか? たとえば、のコンストラクターが呼び出されobjAたときに、 のコンストラクターによって引き起こされる副作用が表示されると想定できますか?objB
  2. [C] デストラクタでobjAandobjBが呼び出されます。これらのデストラクタに同様のシーケンス要件はありますか?
  3. 最後に、活性分析がobjAポイント [B] の後にデッドであることを示した場合、C++ コンパイラはobjA「初期」、つまりコードのポイント [B] と [C] の間でデストラクタを呼び出すことが許可されていますか?
4

2 に答える 2

3

1 C++ 標準は、objA と objB のコンストラクターの相対的な順序付けを指定していますか? たとえば、objB のコンストラクターが呼び出されたときに、objA のコンストラクターによって引き起こされる副作用が表示されると想定できますか?

はい。objAの前に構築されobjBます。

2 [C] で、objA と objB のデストラクタが呼び出されます。これらのデストラクタに同様のシーケンス要件はありますか?

はい、 のobjB前に破棄されobjAます。破壊の順序は構築の順序の逆です。

3 最後に、活性分析により、ポイント [B] の後に objA が死んでいることが示される場合、C++ コンパイラは objA のデストラクタを「早い段階で」、つまり、コードのポイント [B] と [C] の間で呼び出すことができますか?

副作用がある場合ではありません。コンパイラはas-ifルールに従う必要があります。

明確にするために: as-if ルールは、上記の 3 つのポイントすべてに適用されます。

于 2013-06-27T06:08:48.983 に答える
2

§6.6.2

スコープから出ると (どのように達成されても)、そのスコープで構築された自動保存期間 (3.7.3) を持つオブジェクトは、それらの構築の逆の順序で破棄されます。

このリファレンスからの 3 つの質問すべてにほとんど答えています。

于 2013-06-27T06:13:16.937 に答える