c++ 带不同括号的生命周期扩展

问题描述 投票:0回答:1

我正在尝试了解 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";
}

输出

X::X()
X::~X()
Here1
X::X()
Here2
X::~X()
c++ lifetime temporary-objects
1个回答
5
投票

C++20:

此终身规则有以下例外情况:

  • ...

  • 临时绑定到引用元素中的引用 使用直接初始化语法(括号)初始化的聚合 存在直到包含 初始化器,与列表初始化语法 {braces} 相对。

    struct A
    {
        int&& r;
    };
    
    A a1{7}; // OK, lifetime is extended
    A a2(7); // well-formed, but dangling reference
    

这意味着对于

Y y2{X{}};
,temporary的生命周期将延长为
y2
(及其成员);而对于
Y y1(X{});
则不会,临时会在完全表达后立即销毁。

© www.soinside.com 2019 - 2024. All rights reserved.