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

R S*_*ahu 15 c++ language-lawyer temporary-objects c++11

cppreference.com和C++ 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
}
Run Code Online (Sandbox Code Playgroud)

返回的对象getFoo()的生命周期应该延长参考的生命周期.但是,一个简单的测试似乎表明它没有.

标准使用的措辞是否有缺陷?
编译器是否不符合要求?
cppreference.com使用的措词是否有缺陷?

更新

cppreference.com上使用的语言已更新为(强调我的):

每当引用绑定到临时或子对象时,临时的生命周期将延长以匹配引用的生命周期,但以下情况除外:

R S*_*ahu 1

标准使用的措辞是否存在缺陷?

不。

编译器不符合要求吗?

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

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

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