Stroustrup的The C++ Programming Language中的错误?

Error in Stroustrup's The C++ Programming Language?

本文关键字:错误 Language Programming The C++ Stroustrup      更新时间:2023-10-16

Stroustrup的《C++编程语言》(此处为第4版(中§6.3.5.1的最后一句话是:

如果数组或结构初始化,则数组或类的成员默认初始化。

但是,此测试显示默认初始化对象的未初始化成员(我也尝试过g++4.7 -std=c++11(

#include <iostream>
struct Foo
{
    int i;
    Foo();
};
Foo::Foo() {}
int main()
{
    Foo f;
    std::cout << "f.i: " << f.i << std::endl;
    return 0;
}

我一定错过了什么,但是有没有一个解释并不意味着斯特劳斯特鲁普的肯定有错误?


编辑:在回答之后,我明白默认初始化的概念应该包括在文本的其他部分(例如在§17.3.1中(中所谓的未初始化。这听起来很不清楚。事实上,使用 uninitialized 来表示"未显式用户初始化"以外的任何内容(就像那里的情况一样(是一个矛盾:有些东西是默认初始化的,但尚未初始化。除非人们放弃自然语言证据,证明X和un-X对相反的、排他性的事物进行分类......

此外,同一节(§6.3.5.1(中较早的一句如下:

局部变量 [...] 默认情况下不初始化,除非它们是具有默认构造函数的用户定义类型 [...]

矛盾在这里再次显现出来。接受第一个和后面的语句为 true 意味着存在同时默认初始化默认初始化的变量(即局部变量(。

恕我直言,这充其量只是非常不清楚地使用自然语言来描述某些东西。

根据 § 8.5/7:

默认初始化 T 类型的对象意味着:
— 如果 T 是一个(可能符合 cv 的(类类型(条款 9(,则调用 T 的默认构造函数(如果 T 没有可访问的默认构造函数,则初始化格式不正确(;
— 如果 T 是数组类型,则每个元素都是默认初始化的;
— 否则,不执行初始化。

int落在最后一点,因此未初始化。如果你的成员有类型,比如std::string,它将调用std::string的默认构造函数,你将有一个空字符串。