没有名称的变量的破坏顺序

时间:2013-12-04 23:48:49

标签: c++ c++11

有人可以在下面的代码示例中解释为什么barfoo的行为不同?

#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

4 个答案:

答案 0 :(得分:7)

所有变量都有名称。

bar()中,A{}未声明变量。 A{}是构造临时A对象的表达式。像所有临时没有被扩展的临时对象一样,这个A对象在构造它的完整表达式的评估结束时被破坏(非正式地,这意味着“在;”)。

答案 1 :(得分:1)

f中,命名对象a的析构函数在函数末尾运行(当print语句已经运行时)。在bar中,您创建的临时文件仅在创建它的语句中存在。所以它的析构函数在print语句之前被调用。

答案 2 :(得分:1)

bar中,您正在创建A的临时对象,其生命周期仅限于该语句,而在foo中,a的生命周期为整个{{1}}功能

答案 3 :(得分:1)

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