C++ 理解C+的混乱+;标准

C++ 理解C+的混乱+;标准,c++,standards,C++,Standards,在C++98中 12.6.2/4类X的构造函数调用完成后,如果构造函数的mem初始值设定项中未指定X的成员,也未默认初始化,也未在构造函数主体执行期间初始化,则该成员的值不确定 在构造函数体的执行期间,nor初始化意味着什么?成员是否可以在构造函数体内部初始化?在构造函数体执行期间初始化或初始化都不正确 在C++03中,这些单词已从nor初始化(在C++98中)更改为nor给定值 类X的构造函数调用完成后,如果构造函数的mem初始值设定项中未指定X的成员,也未初始化默认值,也未初始化值,也未在构

在C++98中

12.6.2/4类X的构造函数调用完成后,如果构造函数的mem初始值设定项中未指定X的成员,也未默认初始化,也未在构造函数主体执行期间初始化,则该成员的值不确定

在构造函数体的执行期间,nor初始化意味着什么?成员是否可以在构造函数体内部初始化?

在构造函数体执行期间初始化或初始化都不正确

在C++03中,这些单词已从nor初始化(在C++98中)更改为nor给定值

类X的构造函数调用完成后,如果构造函数的mem初始值设定项中未指定X的成员,也未初始化默认值,也未初始化值,也未在构造函数主体执行期间指定值,则该成员具有不确定值


其实很简单。类/结构成员可以包含具有默认构造函数的对象,但如果它们不包含,并且您不必在初始化器列表中为它们指定值,也不必在构造函数体中设置它们,那么它们占用的内存(无论从堆栈或堆中为它们查找什么)基本上仍将包含旧垃圾,即,一个不确定的值

考虑:

struct X
{
    X() : x1(1) { x2 = 2; }
    double x1, x2, x3;
    std::string x4;
};

这里,
x1
x2
X
的构造函数显式初始化,而
x4
作为
std::string
的默认构造为“/length 0”<然而,代码> X3可能是任何东西,而且在它被设置之后(它是未定义的行为并且真的可以咬到某些系统),不应该被读取。考虑到它占用的内存的位模式甚至可能不是一个双值的有效值,所以从它读取可能会触发一些CPU异常/陷阱/中断)。.

我没有C++03的副本。我从哪里可以得到它?在片段“在构造函数主体的执行过程中也没有初始化”中,C++03标准以非正式的方式使用“初始化”一词来表示“分配了一个值”。@Bazinga:你不能免费获得它。@j_random_hacker,在4.1中也是如此“如果glvalue引用的对象不是T类型的对象,也不是从T派生的类型的对象,或者如果该对象未初始化,则需要此转换的程序具有未定义的行为。”@Bazinga:Amazon(可能还有其他人)有一个死树版本,ISBN 978-0470846742。我没有C++03的副本。我从哪里可以得到它?只有最后的草稿是免费的-一个快速的谷歌找到了许多来源-例如,这通常对我来说是最方便的,但你可以订购一个正式的最终版本,只需一些小费用(20或30美元)…我记不清从哪里来。@Bazinga:有关获取标准副本的说明,请参见[6.3]。