【发布时间】:2013-07-04 20:14:11
【问题描述】:
Stroustrup 的C++ 编程语言(此处为第 4 版)第 6.3.5.1 节的最后一句是:
如果数组或结构被初始化,则默认初始化数组或类的成员。
但是,this test 显示默认初始化对象的 未初始化 成员(我也尝试使用 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;
}
我一定是遗漏了什么,但有什么解释不意味着 Stroustrup 的断言中有错误吗?
编辑:在回答之后,我了解到 default initialized 的概念应该在文本的其他部分包含所谓的 uninitialized 内容(例如,在 §17.3. 1)。这对我来说听起来很不清楚。实际上,使用 未初始化 来表示“未明确用户初始化”(如其中的情况)之外的任何内容是矛盾的:有些东西是默认初始化但未初始化。除非人们放弃 X 和 un-X 分类相反的、排他的事物集的自然语言证据......
此外,同一节(第 6.3.5.1 节)中的前一句为
局部变量 [...] 默认情况下不会初始化,除非它们是具有默认构造函数的用户定义类型 [...]
这里的矛盾再次明显。接受第一个和后一个语句为真意味着有变量(即局部变量)同时默认初始化和默认未初始化。
恕我直言,这充其量只是用自然语言来描述事物的一种非常不清楚的用法。
【问题讨论】:
-
我认为是:“默认初始化”可以“初始化为未定义的值”。它已初始化,可安全写入,但未定义读取。但是,是的,措辞令人困惑,而且确实自相矛盾。
标签: c++ default-constructor initialization built-in-types