在這次演講中,作者提到了基于標準的生命周期擴展規則擴展到成員初始值設定項。我看到相反的情況,即~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";
}
輸出是
Y::Y()
X::X(const Y&)
Y::~Y()
Hello
X::~X()
編輯:我看到以下更新的不同之處在于聚合初始化
struct X {
~X() {
cout << __PRETTY_FUNCTION__ << "\n";
}
/*
X(const Y& y) : ref(y) {
cout << __PRETTY_FUNCTION__ << "\n";
}
*/
const Y &ref;
};
int main() {
const X &ref = X{Y{}};
cout << "Hello\n";
}
在這種情況下,輸出是
Y::Y()
Hello
X::~X()
Y::~Y()
uj5u.com熱心網友回復:
它僅適用于聚合初始化的情況,因為否則會呼叫建構式,純右值將系結到該建構式的參考引數,而不是直接系結到參考成員。
此外,它不適用于在 C 20 及更高版本中使用圓括號代替大括號的聚合初始化。(這種情況有一個特定的例外。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/537166.html
標籤:C C 11
