use*_*729 16 c++ lifetime temporary-objects
我试图理解 C++ 中的生命周期延长保证。有人可以解释为什么下面不同类型括号的使用在调用临时对象析构函数时会产生不同的结果吗?
#include <iostream>
struct X {
X() {
std::cout << __PRETTY_FUNCTION__ <<"\n";
}
~X() {
std::cout << __PRETTY_FUNCTION__ <<"\n";
}
};
struct Y {
X &&y;
};
int main() {
Y y1(X{});
std::cout << "Here1\n";
Y y2{X{}};
std::cout << "Here2\n";
}
Run Code Online (Sandbox Code Playgroud)
输出
X::X()
X::~X()
Here1
X::X()
Here2
X::~X()
Run Code Online (Sandbox Code Playgroud)
son*_*yao 18
自C++20起:
此生命周期规则有以下例外情况:
...
到使用直接初始化语法(括号)初始化的聚合的引用元素中的引用的临时绑定一直存在,直到包含初始化程序的完整表达式结束为止,这与列表初始化语法{大括号}相反。
Run Code Online (Sandbox Code Playgroud)struct A { int&& r; }; A a1{7}; // OK, lifetime is extended A a2(7); // well-formed, but dangling reference
这意味着对于Y y2{X{}};, 临时对象的生命周期将延长为y2(及其成员);而对于Y y1(X{});它不会,临时将在完全表达后立即被销毁。
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |