问题描述
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++ 通常需要复制或移动,而新版本则要求通过复制省略就地构造。