【问题标题】:Extending the life of a temporary object by getting a reference to a subobject通过获取对子对象的引用来延长临时对象的生命周期
【发布时间】:2017-05-26 19:46:12
【问题描述】:

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 使用的语言已更新为(强调我的):

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

【问题讨论】:

  • 编译器不会按照标准所说的去做。一定是标准中的错误!不可能是编译器的错误!
  • 抛开Snark,见gcc.gnu.org/bugzilla/show_bug.cgi?id=54293。这在 GCC 7 中已修复。cppreference 和标准在编写时是正确的。
  • @T.C.,cppreference.com 的措辞暗示,无论是否有意,临时对象的生命周期都不会通过获取成员子对象的引用来延长。
  • 好吧,它没有说它没有扩展......已修复。
  • 使用 gcc/clang here 按预期工作。

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


【解决方案1】:

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

没有。

编译器不符合标准吗?

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

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

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

【讨论】:

  • 我有点惊讶没有人指出它是一个 const 引用而不是一个普通的引用。这有很大的不同。非常量引用不会产生相同的效果。
  • @shargors,const&amp; 部分是隐含的。您无法获得对临时对象或临时对象子对象的非常量引用。
  • 没错。我想标准会明确说明这一点。
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
相关资源
最近更新 更多