混合使用指针和非指针对象时,对象的初始化顺序是什么?

In what order are objects initialized when mixing pointers and non-pointer objects?

取以下代码:

Foo *foo = fooFactory();
Bar bar(foo);

我有三个问题:

  1. 这里安全吗?换句话说,我是否保证在 Bar 的构造函数是 运行 之前调用 fooFactory() 并初始化 foo (假设 fooFactory() 不抛出) ?
  2. 如果这是函数的一部分、class 的一部分,或者只是任何块外的裸声明,问题 1 的答案会改变吗?
  3. 如果 Bar 的构造函数实际上没有采用 Foo 指针,而是直接引用 foo 变量,答案会改变吗?

感谢您的宝贵时间。

  1. 是的,它很安全并且可以按预期工作
  2. 不,顺序没有改变。它只能在构造函数中的成员初始值设定项列表中更改(但这是不同的语法)。
  3. 不,这也不会改变答案。

在 C++(和 C)中,语句按照它们在源代码中出现的顺序执行(或看似执行)。在as-if规则下,为了提高性能,当语句B对语句A没有依赖时,可能会出现乱序执行。因此,给定:

int i = 1;
int j = 2;
int k = i + j;

前两个语句可能会乱序执行,但第三个绝不能。 (当然,在现实生活中,像这样的简单语句经常被优化掉,但你懂的)。

因此,在您发布的代码中,第二个语句使用第一个语句的结果,因此语句将按顺序执行。