没有名称的变量的销毁顺序

Destruction order of variable without a name

本文关键字:顺序 变量 有名称      更新时间:2023-10-16

有人能解释一下为什么bar在以下代码示例中的行为与foo不同吗?

#include <iostream>
using namespace std;
struct A { 
    A() { cout << "A"; }
    ~A() { cout << "B"; }
};
void foo() {
        A a{};
        cout << "X";
}
void bar() {
        A {};
        cout << "X";
}
int main() {
        foo();
        cout << endl;
        bar();
        cout << endl;
}

输出(gcc 4.8.1,Ubuntu 13.10,使用--std=c++11编译):

AXB
ABX

所有变量都有名称。

bar()中,A{}不声明变量。A{}是构造临时A对象的表达式。与所有寿命未以其他方式延长的临时对象一样,该A对象在对其构建的完整表达式求值结束时被销毁(非正式地说,这意味着"在;处")。

f中,命名对象a的析构函数在函数末尾运行(此时print语句已经运行)。在bar中,您正在创建一个仅在创建它的语句期间存在的临时。所以它的析构函数是在print语句之前调用的。

bar中,您正在创建一个A的临时对象,其生存期仅限于该语句,而在foo中,a的生存期用于整个函数。

A {};定义的临时对象只存在于完整表达式的末尾,即分号。A a{};定义的命名对象一直存在于函数体范围的末尾。