没有名称的变量的销毁顺序
Destruction order of variable without a name
有人能解释一下为什么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{};
定义的命名对象一直存在于函数体范围的末尾。
相关文章:
- 在循环中按顺序遍历成员变量
- C++编译器是否优化了顺序静态变量读取?
- 按字母顺序对结构内数组变量中的名称进行排序
- 字符串变量顺序
- 变量按什么顺序相乘
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 线程局部变量的初始化顺序
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 类静态变量初始化顺序
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 使用 while 循环显示顺序变量的值
- 同一函数中的静态函数变量初始化顺序
- 当变量的顺序发生变化时C++双倍乘法会产生不同的结果
- C 11指定静态/全局变量的构造顺序
- 单个Cout中单个变量的多个更新的顺序
- 为什么在定义静态成员变量时不遵循定义顺序
- 静态全局变量初始化顺序
- 类模板中成员变量的顺序
- 我可以在C 中更改静态变量初始化顺序吗?
- C++全局变量初始化顺序