绑定到成员初始值设定项列表中的引用成员的临时对象的生命周期(C ++ 14)

时间:2016-05-31 15:07:54

标签: c++ reference c++14 temporary-objects

我在cppreference.com上查找lifetime of a temporary,我发现C ++ 14发生了一些变化:

  

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

     

...

     

构造函数初始值设定项列表中的引用成员的临时绑定仅在构造函数退出之前持续存在,而不是   只要对象存在。 (注意:这样的初始化是错误的   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

我误解了吗?

1 个答案:

答案 0 :(得分:5)

您引用的缺陷报告已被采纳,N4582已在[class.base.init]中包含新措辞:

  

绑定到 mem-initializer 中引用成员的临时表达式格式不正确。 [实施例:

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

- 结束示例]

因此它没有延长对象的生命周期 - 代码只是格式不正确。 gcc和clang都会在我尝试的每个版本上对你的代码发出警告,我认为这符合要求,但理想情况下它们应该在那里出错。