C++ 静态和动态初始化示例
是否有一个实例,其中变量以静态和动态方式初始化。即,如规范所述 静态初始化应在任何动态初始化之前进行 初始化发生C++ 静态和动态初始化示例,c++,initialization,C++,Initialization,是否有一个实例,其中变量以静态和动态方式初始化。即,如规范所述 静态初始化应在任何动态初始化之前进行 初始化发生 我假设变量可以在同一个程序中以静态和动态的方式初始化。虽然,我认为,初始化是初始值的定义。也就是说,变量初始化一次,就不能再初始化了。当然:静态初始化是在任何用户代码运行之前进行的,它用零填充所有对象 这些零可能在执行其他初始值设定项时可见。阅读有关 请注意,在动态初始化完成之前,对象不会被认为是构造的,您必须遵循生存期规则[basic.life]标准中说: 对象的生存期是对象的运行
我假设变量可以在同一个程序中以静态和动态的方式初始化。虽然,我认为,初始化是初始值的定义。也就是说,变量初始化一次,就不能再初始化了。当然:静态初始化是在任何用户代码运行之前进行的,它用零填充所有对象 这些零可能在执行其他初始值设定项时可见。阅读有关 请注意,在动态初始化完成之前,对象不会被认为是构造的,您必须遵循生存期规则<代码>[basic.life]标准中说: 对象的生存期是对象的运行时属性。如果一个对象属于类或聚合类型,并且它或它的一个成员是由一个构造函数而不是一个普通的默认构造函数初始化的,则称该对象具有非普通的初始化。[注:普通复制/移动构造函数的初始化是非普通初始化。-结束注]类型为
T
的对象的生存期始于:
- 获得类型
的正确对齐和尺寸的存储,以及T
- 如果对象具有非平凡的初始化,则其初始化已完成
- 将左值到右值的转换(4.1)应用于该glvalue
- glvalue用于访问非静态数据成员或调用对象的非静态成员函数,或
- glvalue绑定到对虚拟基类(8.5.3)的引用,或
- glvalue用作
动态转换的操作数(5.2.7)或
类型ID的操作数
因此,访问非原语类型的对象的(归零)内容很容易导致未定义的行为。当然:静态初始化在任何用户代码运行之前进行,将所有对象填充为零 这些零可能在执行其他初始值设定项时可见。阅读有关 请注意,在动态初始化完成之前,对象不会被认为是构造的,您必须遵循生存期规则<代码>[basic.life]标准中说: 对象的生存期是对象的运行时属性。如果一个对象属于类或聚合类型,并且它或它的一个成员是由一个构造函数而不是一个普通的默认构造函数初始化的,则称该对象具有非普通的初始化。[注:普通复制/移动构造函数的初始化是非普通初始化。-结束注]类型为
T
的对象的生存期始于:
- 获得类型
的正确对齐和尺寸的存储,以及T
- 如果对象具有非平凡的初始化,则其初始化已完成
- 将左值到右值的转换(4.1)应用于该glvalue
- glvalue用于访问非静态数据成员或调用对象的非静态成员函数,或
- glvalue绑定到对虚拟基类(8.5.3)的引用,或
- glvalue用作
动态转换的操作数(5.2.7)