簡體   English   中英

通過獲取對子對象的引用來延長臨時對象的生命周期

[英]Extending the life of a temporary object by getting a reference to a subobject

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上使用的語言已更新為(強調我的):

每當引用綁定到臨時或子對象時 ,臨時的生命周期將延長以匹配引用的生命周期,但以下情況除外:

標准使用的措辭是否有缺陷?

沒有。

編譯器是否不符合要求?

是。 正如評論中指出的那樣,它已在新版本的g ++,g ++ 7中得到修復。相關鏈接: http//gcc.gnu.org/bugzilla/show_bug.cgi?id = 54293

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

是。 cppreference.com頁面的內容已更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM