1

鉴于:

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

是保证v1之前构造v2的,还是没有定义顺序?我在标准中找不到答案(即使我知道它在某处)。

4

3 回答 3

3

假设没有进行优化,那么是的,这在程序执行第 14 段中的C ++标准草案涵盖:1.9

与完整表达式关联的每个值计算和副作用在与要评估的下一个完整表达式关联的每个值计算和副作用之前排序。8

实际上,实现只是有义务模拟可观察的行为,这被称为第1段中涵盖的as-if 规则,它说(强调我的):

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

脚注5说:

该规定有时被称为“好像”规则,因为只要从可观察的行为中可以确定,只要结果是好像该要求已被遵守,实施就可以自由地忽略本国际标准的任何要求的程序。例如,如果一个实际的实现可以推断出它的值没有被使用并且没有产生影响程序可观察行为的副作用,那么它就不需要评估表达式的一部分。

于 2014-06-16T12:27:24.730 回答
2

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

于 2014-06-16T12:18:06.920 回答
0

是的,对象总是按照它们被定义的顺序构造的。如果你在一行上做是一样的:

    std::vector<int> v1, v2;

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

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

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

此处无需调用 as-if 规则。对象的构造保证了任何意义和行为,您将得到。无论什么不能保证,一开始就不是语言或程序的一部分。

于 2014-06-16T12:37:03.577 回答