自动变量创建的顺序是否与声明的顺序相对应?

时间:2014-06-16 12:16:49

标签: c++ declaration language-lawyer variable-initialization

假设:

void foo()
{
    std::vector<int> v1;
    std::vector<int> v2;
}

是否保证在v1之前构建v2,或者订单未定义?我无法在标准中找到答案(尽管我知道它在某处)。

3 个答案:

答案 0 :(得分:3)

假设没有进行任何优化,那么1.9 程序执行 14 中的draft C++ standard涵盖了这一点:

  

与a相关的每个值计算和副作用   full-expression在每个值计算和side之前排序   效果与下一个要评估的完整表达相关联。 8

实际上,实现只能模拟可观察的行为,这被称为 as-if rule ,在 1 段中有所说明(强调我的):

  

本国际标准中的语义描述定义了一个   参数化非确定性抽象机。这个国际   标准对符合结构没有要求   实现。特别是,他们不需要复制或模仿   抽象机器的结构。 相反,符合实施   需要模仿(仅)抽象的可观察行为   机器如下所述 5

脚注5说:

  

这项规定有时被称为“as-if”规则,因为a   实施可以自由地忽视任何要求   国际标准只要结果就好像要求一样   从可观察的角度来看,已经服从了   该计划的行为。例如,实际的实施需要   如果它可以推导出它的值,则不评估表达式的一部分   未使用,没有影响可观察行为的副作用   制作该节目。

答案 1 :(得分:2)

是和否。它保证观察到的行为等同于按照声明它们的顺序构造它们,但由于优化它们可能根本不构造它们。

答案 2 :(得分:0)

是的,对象始终按照定义的顺序构建。如果您在一行上执行它,它们是相同的:

    std::vector<int> v1, v2;

或者如果他们是班级的成员:

struct foo()
{
    std::vector<int> v1;
    std::vector<int> v2;
};

构造的顺序是定义的顺序,破坏的顺序是相反的。

此处无需调用as-if规则。无论通过构造物体保证什么意义和行为,你都会得到。无论什么都不能保证,首先从来不是语言或程序的一部分。