有人可以在下面的代码示例中解释为什么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
答案 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{};
定义的命名对象存在于函数体范围的末尾。