在cppreference.com和C++11标准中,关于临时对象何时生命期延长有微妙的差异(重点是我的)。
当引用绑定到临时对象或临时对象的基类子对象时,临时对象的生命期将延长以与引用的生命期相匹配,
来自C++11标准:
第二种情况是引用被绑定到一个临时对象。被绑定的临时对象或者被引用的子对象是完整临时对象,除非:
根据标准,子对象可以是成员子对象,基类子对象或数组元素。
如果我们严格按照标准在以下示例代码中执行:
struct Foo
{
Foo() : a(10), b(20) {}
~Foo() { std::cout << "In Foo::~Foo()\n"; }
int a;
int b;
};
Foo getFoo()
{
return Foo();
}
void testFoo1()
{
int const& r = getFoo().a;
std::cout << "In testFoo1()\n";
(void)r; // Shut up the compiler
}
getFoo()
返回的对象的生命周期应该与引用的生命周期相同。然而,一个简单的测试似乎表明它并不是这样。标准使用的措辞是缺陷吗? 编译器是否不符合规范? cppreference.com 使用的措辞是缺陷吗?
更新 cppreference.com 中使用的语言已更新为(强调我的):
“每当一个引用被绑定到一个临时对象或其子对象时,临时对象的寿命都会延长以匹配引用的寿命,但以下情况除外:”