【发布时间】:2021-11-10 18:56:42
【问题描述】:
对象或引用的生命周期是对象或引用的运行时属性。如果一个变量是默认初始化的,并且如果它是类类型或其(可能是多维的)数组,那么该类类型具有一个普通的默认构造函数,则称该变量具有空初始化。
T类型对象的生命周期开始于:
- 获得了具有适合
T类型的正确对齐和大小的存储,并且- 其初始化(如果有)已完成(包括空初始化)([dcl.init]),
除非对象是联合成员或其子对象,否则它的生命周期仅在联合成员是联合中的初始化成员([dcl.init.aggr]、[class.base.init])时才开始,或如 [class.union] 和 [class.copy.ctor] 中所述,但 [allocator.members] 中所述除外。
如果没有为对象指定初始化器,则该对象是默认初始化的。
当一个对象获得自动或动态存储时长的存储时,该对象有一个不确定的值,如果没有对该对象执行初始化,该对象将保留一个不确定的值,直到该值被替换([expr.ass])。 [注意 1:具有静态或线程存储持续时间的对象是零初始化的,请参阅 [basic.start.static]。 — 尾注]
考虑这个 C++ 程序:
int main() {
int i;
i = 3;
return 0;
}
函数main的第一条语句int i;或第二条语句i = 3;是否按照C++标准进行初始化?
我认为是前者,它对不确定的值执行空初始化,因此开始对象的生命周期(后者不执行初始化,它执行对值 3 的赋值)。如果是这样,是否真的可以将存储分配与对象初始化分开?
【问题讨论】:
-
嗯,
extern int x; .... int x = 42;不是将两者分开吗? (初始化声明) -
我不明白您引用的任何内容与您关于初始化分离声明的问题有何关系。
-
From Default initialization "默认初始化的效果是: .... 否则,不执行初始化:具有自动存储持续时间的对象(及其子对象)包含不确定的值。"
-
int i; i = 3;是一个定义(和声明),没有初始化,后跟一个赋值. -
@Maggyero 静态初始化是运行时过程的一部分,而声明和定义是编译时问题。我不清楚你在问他们之间的关系。
标签: c++ initialization language-lawyer object-lifetime