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引用应该扩展临时对象的生命周期。
这段代码会产生未定义的行为输出。所以没有生命周期延长。
为什么?我的意思是有人能够逐步解释发生了什么吗?
我的推理链哪里错了?
foo():
1. A(32) - 构造函数 2. return A(32) - 创建一个对本地对象的const引用并返回 3. A a = foo(); - a被foo()返回的值初始化,返回的值超出了作用域(超出了表达式),被销毁,但a已经初始化;
(实际上,在复制构造函数之前调用了析构函数)
foo_2():
1. return 6 - 隐式创建类型为A的临时对象,创建对该对象的const引用(扩展其生命周期)并返回 2. A a = foo(); - a被foo()返回的值初始化,返回的值超出了作用域(超出了表达式),被销毁,但a已经初始化;
(实际上,在复制构造函数之前调用了析构函数)