gpt4 book ai didi

c++ - 进入嵌套范围的自动存储的生命周期

转载 作者:行者123 更新时间:2023-12-03 06:56:26 28 4
gpt4 key购买 nike

假设有一个具有自动存储持续时间的对象,并且该对象是从嵌套范围内复制初始化的,就像循环体一样。从嵌套范围内创建的值的生命周期是否扩展到包含范围?

#include<iostream>
using namespace std;

class Thing {
public:
int data;
Thing(int data) : data(data) { cout << "making a thing" << endl; }
~Thing() { cout << "destroying a thing" << endl; }
};

int main() {
Thing t = Thing(-1);
for (int i = 0; i < 4; i++) {
t = Thing(i); // this is both created AND destroyed from within this scope...?
}
cout << t.data << endl; // undefined behavior?
}

现在,在最后访问 t.data 是可行的,但我看到每个 Thing 的析构函数在每次循环迭代中被调用一次,所以我可能只是走运?

这看起来很相关(但我不是律师,所以很难解读):some 2011 c++ standard
具体来说:

  1. For such an object [with automatic storage duration] that does not have a variable length array type, its lifetime extends from entry into the block with which it is associated until execution of that block ends in any way...

因此,如果我的代码片段是未定义的行为 - 对于要更改局部变量的循环体,应该手动分配该局部变量,然后手动释放该局部变量,或者...?

最佳答案

这是完全合法的定义行为。

您的错误在于认为在 block 内创建的 Thing 的生命周期很重要。它没有。复制后,复制分配的 t 没有改变它的;它仍然是在 block 外创建的 t,只是更新了它的值。它的生命周期完全不受影响。在您引用的上下文中,“与它 [t] 相关联的 block ”是顶级函数作用域(声明它的位置),而不是它被复制分配的 block .

在 block 中创建的 Thing 每次都会过期,但这没关系;它被复制,然后再也没有使用过。

关于c++ - 进入嵌套范围的自动存储的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63919497/

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