2016-05-31 61 views
3

我仰視上cppreference.com lifetime of a temporary,我發現的東西從C++ 14改變在構件初始化列表綁定到一個基準部件的臨時對象的:壽命(C++ 14)

每當引用綁定到一個臨時的或到的 臨時基類子對象,臨時的壽命延長到 壽命的基準的匹配,但有以下例外:

...

一個臨時的參考構造函數初始值設定項列表中的e成員僅在構造函數退出前持久存在,而不存在於對象存在時的 。 (注:如初始化形成不良的DR 1696 )(直到C++ 14)

我檢查的標準真的沒有這樣的說法。 ($ 12.2/5臨時對象[class.temporary])

這是否意味着從C++ 14臨時綁定到引用成員的生命週期將擴展到對象的生命週期?

我試過下面的代碼,GCCCLANG都看起來不是,臨時會在構造函數結束時被銷燬。

#include <iostream> 

struct X { 
    ~X() { std::cout << "X dtor\n"; } 
}; 
struct Y { 
    Y() : x_(X()) { std::cout << "Y ctor\n"; } 
    const X& x_; 
    ~Y() { std::cout << "Y dtor\n"; } 
}; 
int main() 
{ 
    Y y; 
    std::cout << "Hello, world!\n"; 
} 

結果:

Y ctor 
X dtor 
Hello, world! 
Y dtor 

難道我誤會了?

+4

您是否閱讀過[缺陷報告](http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1696)? – NathanOliver

+1

**是**(您誤解了它) – Walter

回答

5

你所引用的缺陷報告已經通過,N4582已經包括在[class.base.init]新的措辭:

的臨時表達結合至在MEM-初始化基準部件是非法的構造。 [實施例:

struct A { 
    A() : v(42) { } // error 
    const int& v; 
}; 

- 端示例]

所以它不是延長對象的生存期 - 的代碼只是形成不良。 gcc和clang都會在我嘗試過的每個版本上對您的代碼發出警告,我認爲這些警告符合要求,但理想情況下它們應該在那裏出錯。

+0

僅僅發出警告是不合格的;除非另有說明,如果某些東西是「不合格」的,那麼編譯器必須發出diagonstic。但是C++ 17還沒有完成。 –

+5

@NicolBolas一個警告是一個診斷,只要錯誤或警告是 – NathanOliver

+0

@NathanOliver實現定義警告是否爲診斷你是否分別鏈接到支持你所說的clang和gcc的文檔? –