gpt4 book ai didi

c++ - 返回对本地对象的 const 引用时到底发生了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:48 25 4
gpt4 key购买 nike

struct A {
A(int) : i(new int(783)) {
std::cout << "a ctor" << std::endl;
}

A(const A& other) : i(new int(*(other.i))) {
std::cout << "a copy ctor" << std::endl;
}

~A() {
std::cout << "a dtor" << std::endl;
delete i;
}

void get() {
std::cout << *i << std::endl;
}

private:
int* i;
};

const A& foo() {
return A(32);
}

const A& foo_2() {
return 6;
}

int main()
{
A a = foo();
a.get();
}

我知道,返回对本地值的引用是不好的。但是,另一方面,const 引用应该延长临时对象的生命周期。

这段代码产生一个 UB 输出。所以没有生命周期延长。

为什么?我的意思是有人可以逐步解释发生了什么吗?

我的推理链哪里出了问题?

foo():

  1. A(32) - 运营商

  2. return A(32) - 创建并返回对本地对象的 const 引用

  3. A = foo(); - a 由 foo() 返回值初始化,返回值超出范围(超出表达式)并被销毁,但 a 已经初始化;

(但实际上析构函数是在复制构造函数之前调用的)

foo_2():

  1. return 6 - 类型 A 的临时对象被隐式创建,一个对该对象的 const 引用被创建(延长其生命周期)并被返回

  2. A = foo(); - a 由 foo() 返回值初始化,返回值超出范围(超出表达式)并被销毁,但 a 已经初始化;

(但实际上析构函数是在复制构造函数之前调用的)

最佳答案

语言规范中明确规定了每个特定上下文的临时生命周期延长规则。它说

12.2 Temporary objects

5 The second context is when a reference is bound to a temporary. [...] A temporary bound to the returned value in a function return statement(6.6.3) persists until the function exits. [...]

您的临时对象在函数退出时被销毁。这发生在接收者对象的初始化开始之前。

您似乎认为您的临时工应该比这活得更久。显然,您正在尝试应用这样的规则,即临时文件应该在完整表达式结束之前一直存在。但该规则不适用于在函数内部创建的临时对象。此类临时对象的生命周期受其自身专用规则的约束。

如果有人试图使用返回的引用,您的 foo 和您的 foo_2 都会产生未定义的行为。

关于c++ - 返回对本地对象的 const 引用时到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11747652/

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