创建一个像 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++ 通常需要复制或移动,而新版本则要求通过复制省略进行就地构造.
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++ 通常需要复制或移动,而新版本则要求通过复制省略进行就地构造.