假设我们有两个具有自动存储持续时间的对象:
{
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 ++标准是否指定
objA
和objB
的构造函数的相对顺序?例如,我们可以假设调用objA
的构造函数时,由objB
的构造函数引起的任何副作用是可见的吗?在[C]中,将调用
objA
和objB
的析构函数。这些析构函数是否有类似的排序要求?最后,如果活动性分析显示
objA
在[B]点之后死亡,是否允许C ++编译器为objA
“较早”(即代码中的[B]和[C]点之间)调用析构函数? 最佳答案
1 C ++标准是否指定objA和objB的构造函数的相对顺序?例如,我们可以假设调用objB的构造函数时,由objA的构造函数引起的任何副作用是可见的吗?
是。 objA
在objB
之前构造。
2在[C]处,将调用objA和objB的析构函数。这些析构函数是否有类似的排序要求?
是的,objB
在objA
之前被销毁。破坏顺序与构造顺序相反。
3最后,如果活动性分析显示objA在点[B]之后死了,是否允许C ++编译器为objA“较早”(即代码中的点[B]和[C]之间)调用析构函数?
如果有副作用则不会。编译器必须遵循as-if规则。
需要说明的是:“视情况”规则适用于以上所有三点。