Stroustrup的C++编程语言出错?

ric*_*cab 3 c++ initialization default-constructor built-in-types

Stroustrup的The C++ Programming Language(第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;
}
Run Code Online (Sandbox Code Playgroud)

我必须遗漏一些东西,但有没有一个解释并不代表Stroustrup的肯定错误?


编辑:在答案之后,我理解默认初始化的概念应该包括在文本的其他部分中被称为初始化的概念(例如,在§17.3.1中).这对我来说听起来很不清楚.实际上,使用未初始化来表示除"未明确用户初始化"之外的任何内容(就像在那里一样)是一个矛盾:有些东西是默认初始化但尚未初始化.除非有人放弃X和un-X分类相反的自然语言证据,否则排他性......

此外,同一部分(第6.3.5.1节)中的较早句子也是如此

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

这里的矛盾再次明显.接受第一个和后一个语句都是真的意味着存在同时默认初始化默认情况下未初始化的变量(即局部变量).

恕我直言,这充其量是一种非常不清楚的自然语言用来描述某些东西.

chr*_*ris 6

根据§8.5/ 7:

默认初始化类型为T的对象意味着:
- 如果T是(可能是cv-quali fi ed)类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认值,则初始化是错误的构造函数);
- 如果T是数组类型,则每个元素都是默认初始化的;
- 否则,不执行初始化.

int落在最后一点,所以它没有初始化.如果您的成员具有类型,比方说,std::string它将调用默认构造函数,std::string并且您将拥有一个空字符串.

  • @ricab,该标准定义了默认初始化,值初始化和零初始化.未初始化不是这些类别之一.对于你的全局变量注释,它们是零初始化的(第3.6.2/2节),对于`int`(基本上所有的东西)都意味着0.初始化`int`的值也会给你0.但是,默认 - 初始化它不会,它会使它未初始化.当你在没有任何初始化程序的情况下声明一个普通的本地`int`时,这是默认的事情.`int`不是用户定义的类型,因此默认情况下不会初始化. (3认同)