#include <iostream>
using namespace std;
struct A {
// Some Other Code
int x;
};
A a1;
int main(){
A a2;
cout << "a1.x = " << a1.x << endl;
cout << "a2.x = " << a2.x << endl;
return 0;
}
C++14 标准 (ISO/IEC 14882:2014) 第 8.5 节第 12 段:
如果没有为对象指定初始化程序,则该对象是默认初始化的。当获得具有自动或动态存储持续时间的对象的存储时,该对象具有不确定的值,如果没有对该对象执行初始化,则该对象将保留一个不确定的值,直到该值被替换(5.17)。[ 注意:具有静态或线程存储持续时间的对象是零初始化的,请参见 3.6.2。- 结束注]
那么a1
有静态存储持续时间和a2
自动存储持续时间吗?的定义Struct A
在全局命名空间以及a1
声明中,而a2
声明在块范围内(在main()
函数内部)。
此外,第 3.6.2 节说:
第 1 段:
作为程序启动的结果,具有静态存储持续时间的非局部变量被初始化。
第 2 段:
具有静态存储持续时间 (3.7.1) 或线程存储持续时间 (3.7.2) 的变量应在任何其他初始化发生之前进行零初始化 (8.5)。
此外,使用 gcc 5.4.0 我会收到警告 ( warning: 'a2.A::x' is used uninitialized in this function [-Wuninitialized]
) 和随机值,但使用 clang 3.8.0 输出始终是a2.x = 0
(零也可以是不确定的值)。我还做了其他更复杂的实验,将嵌套struct
的 s 和默认初始化放在// Some Other Code
. 有时我得到随机值,而其他时候(不是可以忽略的数量)我得到一个零。
结构的存储期限是
A
多少?而对象a1
和a2
?那变量a1.x
和a2.x
?应该
a1.x
零a2.x
初始化吗?还是它们是不确定的值?相同的规则是否适用于
class
和union
?里面的代码有什么区别
// Some Other Code
吗?例如,如果一个类 T“具有带有默认初始化程序的非静态成员”(如 instruct A { int b = 1; int x; };
),那么默认构造函数就不能是微不足道的(即不能执行任何操作)。那个不平凡的构造函数也会初始化x
吗?平凡的默认构造函数
有趣的链接: