gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 15:45:03 28 4
gpt4 key购买 nike

在此talk ,作者提到生命周期扩展规则扩展到基于标准的成员初始值设定项。不过我看到了相反的情况,即 ~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()

最佳答案

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

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

关于带有成员初始值设定项的 C++ 对象生命周期扩展规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74505475/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com