通过获取对子对象

时间:2017-05-26 19:46:12

标签: c++ c++11 language-lawyer temporary-objects

cppreference.comC++11 Standard使用的语言之间存在细微差别,关于临时对象的生命延长时间(强调我的)。

来自cppreference.com

  

只要引用绑定到临时的临时或基础子对象,临时的生命周期就会延长以匹配引用的生命周期,

来自The C++11 Standard

  

第二个上下文是引用绑定到临时的。引用绑定的临时值或绑定引用的子对象的完整对象的临时值在引用的生存期内持续存在,但以下情况除外:

根据标准,a subject can be a member subject, a base class subject, or an array element

如果我们严格遵守以下示例代码中的标准的措辞

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()返回的对象的生命周期应该延长参考的生命周期。但是,a simple test似乎表明它没有。

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

更新

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

  

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

1 个答案:

答案 0 :(得分:1)

  

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

没有

  

编译器是否不符合?

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

  

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

是。 the page at cppreference.com的内容已更新。