【发布时间】:2025-11-25 12:45:01
【问题描述】:
我知道临时不能绑定到非常量引用,但它可以绑定到常量引用。也就是说,
A & x = A(); //error
const A & y = A(); //ok
我也知道,在第二种情况下(以上),由A() 创建的临时对象的生命周期会延长到 const 引用的生命周期(即y)。
但我的问题是:
绑定到临时对象的 const 引用是否可以进一步绑定到另一个 const 引用,从而将临时对象的生命周期延长到第二个对象的生命周期?
我试过了,但没有用。我不完全明白这一点。我写了这段代码:
struct A
{
A() { std::cout << " A()" << std::endl; }
~A() { std::cout << "~A()" << std::endl; }
};
struct B
{
const A & a;
B(const A & a) : a(a) { std::cout << " B()" << std::endl; }
~B() { std::cout << "~B()" << std::endl; }
};
int main()
{
{
A a;
B b(a);
}
std::cout << "-----" << std::endl;
{
B b((A())); //extra braces are needed!
}
}
输出(ideone):
A()
B()
~B()
~A()
-----
A()
B()
~A()
~B()
输出不同?为什么在第二种情况下临时对象A()在对象b之前被破坏?标准 (C++03) 是否讨论过这种行为?
【问题讨论】:
-
B b((A())); //需要额外的大括号! - 你能解释一下吗?
-
@Luchian:是的。你没听说过Most vexing parse吗?
-
请注意,您的程序不包含任何延长生命周期的示例。通过 const 引用传递一个临时变量并不会延长它的生命周期,临时变量仍然在完整表达式结束时被销毁。