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

son*_*yao 3 c++ reference temporary-objects c++14

我在cppreference.com上查找一个临时的生命周期,我发现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";
}
Run Code Online (Sandbox Code Playgroud)

结果:

Y ctor
X dtor
Hello, world!
Y dtor
Run Code Online (Sandbox Code Playgroud)

我误解了吗?

Bar*_*rry 5

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

绑定到mem-initializer中的引用成员的临时表达式是错误的.[例:

struct A {
  A() : v(42) { }  // error
  const int& v;
};
Run Code Online (Sandbox Code Playgroud)

- 结束例子]

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

  • @NicolBolas警告是一种诊断.只要提供错误或警告,那么它就符合要求. (5认同)