通过获取子对象的引用来延长临时对象的生命周期

15

cppreference.comC++11标准中,关于临时对象何时生命期延长有微妙的差异(重点是我的)。

来自cppreference.com

当引用绑定到临时对象或临时对象的基类子对象时,临时对象的生命期将延长以与引用的生命期相匹配,

来自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 中使用的语言已更新为(强调我的):
“每当一个引用被绑定到一个临时对象或其子对象时,临时对象的寿命都会延长以匹配引用的寿命,但以下情况除外:”

2
编译器不按标准执行,肯定是标准有问题!绝对不可能是编译器出了问题! - T.C.
3
开玩笑的话先放一边,参见 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54293。这在GCC 7中已被修复。cppreference和标准所写的是正确的。 - T.C.
@T.C.,cppreference.com使用的措辞意味着,无论是有意还是无意,临时对象的生命周期都不会因为获取成员子对象的引用而延长。 - R Sahu
1
好的,它没说它没有被扩展...已修复。 - T.C.
2
在这里使用gcc/clang可以正常工作链接 - Jarod42
1个回答

1

标准中使用的措辞是否有缺陷?

没有。

编译器是否不符合规范?

是的。正如评论中指出的那样,它已经在更新版本的g++(g++ 7)中得到了修复。相关链接:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54293

cppreference.com使用的措辞是否有缺陷?

是的。cppreference.com页面的内容已经更新。


1
我有点惊讶,没有人指出这是一个const引用而不是普通引用。这会产生很大的差异。非const引用将没有相同的效果。 - shargors
@shargors,“const&”部分是隐含的。您无法获得对临时对象或临时对象子对象的非const引用。 - R Sahu
1
没错。我想标准应该明确规定这一点。 - shargors

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接