在这次演讲中,作者提到了生命周期扩展规则扩展到基于标准的成员初始值设定项。但我看到相反的情况,即在~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)
它仅适用于聚合初始化的情况,因为否则存在构造函数调用,纯右值将绑定到该构造函数的引用参数,而不是直接绑定到引用成员。
此外,它不适用于 C++20 及更高版本中使用括号代替大括号的聚合初始化。(这种情况有一个特定的例外。)