微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决创建一个变量,如 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++ 通常需要复制或移动,而新版本则要求通过复制省略就地构造。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。