创建一个像 x = func(); 这样的变量函数调用和 var 创建顺序定义了吗?

Creating a variable like x = func(); function call and var creation order defined?

void f()
{
    auto x = func();
    int y = func();
    auto z = f1() * f2() + static_cast<int>(f3());
}

我相信应该定义对 func 的调用总是首先发生,在 x 的内存分配之前,对于 auto 的情况,但找不到关于它的信息。

是吗?
它是针对显式写入类型的情况定义的吗?

初始化表达式(func()f1() * f2() + static_cast<int>(f3()))的计算肯定只在到达特定代码行时发生。1

可以在更早的任何时间获得变量的内存(也称为“分配”)...但是无法在定义之前使用该内存,因为在达到定义之前无法命名该内存.变量名由定义引入作用域。

存在于变量中的对象的生命周期不会开始,直到初始化程序被完全评估并放入2 到新对象中。见 [basic.life]:

The lifetime of an object of type T begins when:

  • storage with the proper alignment and size for type T is obtained, and
  • its initialization (if any) is complete (including vacuous initialization)

如果变量的地址从未被获取,变量可能根本不需要任何内存(它可以在其整个生命周期中放入 CPU 寄存器)。


1 好吧,在 as-if 规则下,只要您无法区分,编译器就可以移动它。除非您有未定义的行为,例如数据竞争,否则它的行为将始终与到达该行代码时完成的计算完全一样。

2 对于问题中使用的复制初始化语法,旧版本的 C++ 通常需要复制或移动,而新版本则要求通过复制省略进行就地构造.