gpt4 book ai didi

c++ - 在构造变量之前引用变量是否定义明确

转载 作者:行者123 更新时间:2023-12-05 06:51:59 25 4
gpt4 key购买 nike

这在本质上类似于 question c 的提问和回答。那里的评论暗示 c++ 的精确答案会有所不同,因此这里是用 c++ 编写的代码的类似问题。

下面的程序是否定义明确?

int f(int& b) 
{
b = 42;
return b;
}

int a { f(a) };

这对我来说似乎没问题,但另一方面,a 是如何根据函数计算的值构造的,该函数本身会修改 a?我对此有先有鸡还是先有蛋的感觉,所以最好有一个解释。对于它的值(value),它 appears去工作。

这似乎是同一个问题,所以这里开始;类类型和基本类型的答案会有所不同吗?即以下格式是否正确?

struct S { int i; };

S f(S& b)
{
b.i = 42;
return b;
}

S a { f(a) };

再说一次,不管它值多少钱,这个 appears也可以工作。

最佳答案

该行为似乎在 C++20 中未定义。更改由 P1358 完成,解决 CWG 2256。由于缺陷解决方案通常具有追溯力,因此在所有 C++ 版本中都应将此代码视为 UB。

根据 [basic.life]/1 :

... 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) ...

在调用f(a) 时,对象a 还没有开始它的生命周期,因为它的初始化还没有完成。根据[basic.life]/7 :

Similarly, before the lifetime of an object has started but after the storage which the object will occupy has been allocated ... any glvalue that refers to the original object may be used but only in limited ways. ... The program has undefined behavior if:

  • the glvalue is used to access the object ...

因此,在初始化完成之前写入 a 是 UB,即使存储已经分配。

关于c++ - 在构造变量之前引用变量是否定义明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66050602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com