#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吗?平凡的默认构造函数
有趣的链接: