2016-05-31 118 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的文档? –