0

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

{
   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. objAC++ 标准是否为和指定了构造函数的相对顺序objB?例如,我们是否可以假设在调用 ' 的构造objA函数时会看到由 ' 的构造函数引起的任何副作用?objB
  2. 在 [C] 处,将调用objA和的析构函数。objB这些析构函数是否有类似的排序要求?
  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 最后,如果活性分析表明 objA 在点 [B] 之后死亡,C++ 编译器是否允许“早期”调用 objA 的析构函数,即在代码中的点 [B] 和 [C] 之间?

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

澄清一下:as-if 规则适用于上述所有三点。

于 2013-06-27T06:08:48.983 回答
2

§6.6.2

从范围退出时(无论如何完成),已在该范围内构建的具有自动存储持续时间 (3.7.3) 的对象将按照其构建的相反顺序销毁。

从这个参考资料中几乎可以回答你所有的三个问题。

于 2013-06-27T06:13:16.937 回答