问题 理解C ++标准的困惑


在C ++ 98中

12.6.2 / 4 :在完成对类X的构造函数的调用之后,如果在构造函数中没有指定X的成员 MEM-初始化,也没有默认初始化, 也没有在构造函数的主体执行期间初始化,该成员具有不确定的价值。

是什么 也没有在构造函数的主体执行期间初始化 意思?会员可以吗? 初始化 在构造函数体内?


12865
2017-12-08 04:00


起源



答案:


也没有在构造函数的主体执行期间初始化 是不正确的恕我直言。

在C ++ 03中改变了措辞 也没有初始化 (在C ++ 98中)到 也没有给出价值

在完成对类X的构造函数的调用之后,如果在构造函数的mem-initializers中既未指定X的成员,也未在default-initialized中指定,也未对值进行初始化, 也没有给出价值 在执行构造函数体时,该成员具有不确定的值。


11
2017-12-08 04:02



我没有C ++ 03的副本。我从哪里可以得到它? - Bazinga
IOW中的片段“也没有在构造函数体的执行过程中初始化”,C ++ 03标准以非正式方式使用“初始化”一词来表示“赋值”。 - j_random_hacker
@Bazinga:你不能免费获得它。 - Prasoon Saurav
@j_random_hacker,4.1中的相同“如果glvalue引用的对象不是T类型的对象,并且不是从T派生的类型的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为“。 - Johannes Schaub - litb
@Bazinga:亚马逊(可能是其他人)有一个死树版本,ISBN 978-0470846742。 - MSalters


答案:


也没有在构造函数的主体执行期间初始化 是不正确的恕我直言。

在C ++ 03中改变了措辞 也没有初始化 (在C ++ 98中)到 也没有给出价值

在完成对类X的构造函数的调用之后,如果在构造函数的mem-initializers中既未指定X的成员,也未在default-initialized中指定,也未对值进行初始化, 也没有给出价值 在执行构造函数体时,该成员具有不确定的值。


11
2017-12-08 04:02



我没有C ++ 03的副本。我从哪里可以得到它? - Bazinga
IOW中的片段“也没有在构造函数体的执行过程中初始化”,C ++ 03标准以非正式方式使用“初始化”一词来表示“赋值”。 - j_random_hacker
@Bazinga:你不能免费获得它。 - Prasoon Saurav
@j_random_hacker,4.1中的相同“如果glvalue引用的对象不是T类型的对象,并且不是从T派生的类型的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为“。 - Johannes Schaub - litb
@Bazinga:亚马逊(可能是其他人)有一个死树版本,ISBN 978-0470846742。 - MSalters


它实际上非常简单。 class / struct成员可以包含具有默认构造函数的对象,但如果它们不包含,并且您不打算在初始化列表中为它们赋值,也不在构造函数的主体内设置它们,那么基本上就是它们的内存占用 - 无论是从堆栈还是堆中为它们争吵 - 仍然会有旧垃圾,即不确定的价值。

考虑:

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

这里, x1 和 x2 由...明确初始化 X的构造函数,和 x4 - 成为一个 std::string  - 默认构造为“”/长度0。 x3但是,它可以是任何东西 - 并且不应该在它被设置之后被读取(它是未定义的行为并且实际上可能在某些系统上咬合) - 考虑它占用的内存的位模式甚至可能不是一个有效的值。 double,因此从中读取可能会触发一些CPU异常/陷阱/中断)。


3
2017-12-08 04:09



我没有C ++ 03的副本。我从哪里可以得到它? - Bazinga
只有最终草案可以免费获得 - 快速谷歌提供了许多来源 - 例如 kuzbass.ru:8086/docs/isocpp。这通常对我来说最方便,但你可以订购最终版本的官方副本,只需支付一小笔费用(20或30美元美元)......我不记得究竟是从哪里来的。 - Tony Delroy
@Bazinga:见[6.3] in parashift.com/c++-faq-lite/big-picture.html#faq-6.13 有关获取标准副本的说明。 - Tony Delroy