假设:
void foo()
{
std::vector<int> v1;
std::vector<int> v2;
}
是否保证在v1
之前构建v2
,或者订单未定义?我无法在标准中找到答案(尽管我知道它在某处)。
答案 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规则。无论通过构造物体保证什么意义和行为,你都会得到。无论什么都不能保证,首先从来不是语言或程序的一部分。