创建一个变量,如 x = func();定义了函数调用和 var 创建顺序?

问题描述

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]

T 类型对象的生命周期开始于:

  • 获得具有类型 T 的正确对齐和大小的存储,并且
  • 其初始化(如果有)已完成(包括空初始化)

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


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

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