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 输出。所以没有延长寿命。
为什么?我的意思是有人可以逐步解释发生了什么吗?
我的推理链中的错误在哪里?
富():
A(32) - 演员
return A(32) - 创建并返回对本地对象的 const 引用
A a = foo(); - a 由 foo() 返回值初始化,返回值超出范围(超出表达式)并被销毁,但 a 已经初始化;
(但实际上析构函数是在复制构造函数之前调用的)
foo_2():
return 6 - 隐式创建类型 A 的临时对象,创建对该对象的 const 引用(延长其寿命)并返回
A a = foo(); - a 由 foo() 返回值初始化,返回值超出范围(超出表达式)并被销毁,但 a 已经初始化;
(但实际上析构函数是在复制构造函数之前调用的)