问题描述
struct A {
// something
~A() { std::cout << "A destruct!\n"; }
};
class refWrapper {
public:
refWrapper(const A& a) : a_(a) {}
~refWrapper() { std::cout << "refWrapper destruct!\n"; }
private:
const A& a_;
};
void func(const refWrapper& ref = A()) {
// why ~A after ~refWrapper
// Rather than after refWrapper constructor complete
}
解决方法
使用默认参数,调用
func();
相当于
func(A()); // so func(refWrapper(A()));
所以,
- 临时
A
首先创建(在完整表达式结束时销毁) - 临时
refWrapper
是第二个创建的(绑定到参数引用) - 临时
refWrapper
已销毁。 - 临时
A
已销毁。
注意有一个 exception for lifetime extension or parameter:
在函数调用 ([expr.call]) 中绑定到引用参数的临时对象会一直存在,直到包含调用的完整表达式完成。
所以 refWrapper
在完整表达式结束时被销毁,而不是在 func
调用结束时(尽管在给定示例中是同一时刻)。所以破坏应该按照与构建相反的顺序进行。