C++ 带有成员初始值设定项的对象生命周期扩展规则

use*_*729 2 c++ c++11

在这次演讲中,作者提到了生命周期扩展规则扩展到基于标准的成员初始值设定项。但我看到相反的情况,即在~Y下面打印“Hello”之前调用。作者是否指的是其他东西?

#include <iostream>
using namespace std;

struct Y {
   ~Y() { 
      cout << __PRETTY_FUNCTION__ << "\n";
   }
   Y() { 
      cout << __PRETTY_FUNCTION__ << "\n";
   }
};

struct X {
   ~X() { 
      cout << __PRETTY_FUNCTION__ << "\n";
   }
   X(const Y& y) : ref(y) { 
      cout << __PRETTY_FUNCTION__ << "\n";
   }
   const Y &ref;
};

Y gety() { 
   return {};
}

X getx() { 
   return gety();
}

int main() {
   const X &ref = X{Y{}};
   cout << "Hello\n";
}
Run Code Online (Sandbox Code Playgroud)

输出是

Y::Y()
X::X(const Y&)
Y::~Y()
Hello
X::~X()
Run Code Online (Sandbox Code Playgroud)

编辑:我发现以下更新与聚合初始化有所不同

Y::Y()
X::X(const Y&)
Y::~Y()
Hello
X::~X()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,输出是

Y::Y()
Hello
X::~X()
Y::~Y()
Run Code Online (Sandbox Code Playgroud)

use*_*522 6

它仅适用于聚合初始化的情况,因为否则存在构造函数调用,纯右值将绑定到该构造函数的引用参数,而不是直接绑定到引用成员。

此外,它不适用于 C++20 及更高版本中使用括号代替大括号的聚合初始化。(这种情况有一个特定的例外。)