- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Stroustrup 的 The C++ Programming Language(这里是第 4 版)的 §6.3.5.1 的最后一句话是:
A member of an array or a class is default initialized if the array or structure is.
然而,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 的断言有误?
编辑:在回答之后,我了解到默认初始化的概念应该包括文本其他部分中所谓的未初始化(例如,在§17.3. 1).这对我来说听起来很不清楚。事实上,使用 uninitialized 来表示除“未明确用户初始化”(如此处的情况)之外的任何含义是矛盾的:有些东西是默认初始化的,但尚未初始化。除非有人放弃 X 和 un-X 分类相反的、排他的一组事物的自然语言证据...
此外,同一部分 (§6.3.5.1) 中较早的一句话是
Local variables [...] are not initialized by default unless they are of user-defined types with a default constructor [...]
矛盾在这里再次显现。接受第一个和后面的语句为真意味着存在同时默认初始化和默认未初始化的变量(即局部变量)。
恕我直言,这充其量只是一种非常模糊的自然语言描述方式。
最佳答案
根据 § 8.5/7:
To default-initialize an object of type T means:
— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, no initialization is performed.
int
落在最后一点,因此未初始化。如果您的成员具有类型,例如 std::string
,它将调用 std::string
的默认构造函数,您将得到一个空字符串。
关于c++ - Stroustrup 的 The C++ Programming Language 有错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17477573/
我是一名优秀的程序员,十分优秀!