假设我们有两个具有自动存储持续时间的对象:

{
   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.



C ++标准是否指定objAobjB的构造函数的相对顺序?例如,我们可以假设调用objA的构造函数时,由objB的构造函数引起的任何副作用是可见的吗?
在[C]中,将调用objAobjB的析构函数。这些析构函数是否有类似的排序要求?
最后,如果活动性分析显示objA在[B]点之后死亡,是否允许C ++编译器为objA“较早”(即代码中的[B]和[C]点之间)调用析构函数?

最佳答案

1 C ++标准是否指定objA和objB的构造函数的相对顺序?例如,我们可以假设调用objB的构造函数时,由objA的构造函数引起的任何副作用是可见的吗?


是。 objAobjB之前构造。


  2在[C]处,将调用objA和objB的析构函数。这些析构函数是否有类似的排序要求?


是的,objBobjA之前被销毁。破坏顺序与构造顺序相反。


  3最后,如果活动性分析显示objA在点[B]之后死了,是否允许C ++编译器为objA“较早”(即代码中的点[B]和[C]之间)调用析构函数?


如果有副作用则不会。编译器必须遵循as-if规则。

需要说明的是:“视情况”规则适用于以上所有三点。

10-08 09:42