假设我们有两个具有自动存储持续时间的对象:
{
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.
objA
和objB
的构造函数的相对顺序?例如,我们可以假设在objA
的构造函数被调用时,objB
的构造函数引起的任何副作用都会显示出来吗?objA
和objB
的析构函数。这些析构函数是否有类似的排序要求?objA
在点[B]之后已经死了,那么是否允许C ++编译器调用objA
"早期"的析构函数,即代码中的[B]和[C]点?答案 0 :(得分: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规则适用于上述所有三点。
答案 1 :(得分:2)
§6.6.2
退出范围(无论多么已完成)时,在该范围内构建的具有自动存储持续时间(3.7.3)的对象将在其构造的反向顺序中销毁。
几乎回答了这个参考文献中的所有三个问题。