Stroustrup的The C++ Programming Language中的错误?
Error in Stroustrup's The C++ Programming Language?
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
的默认构造函数,你将有一个空字符串。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- Stroustrup的The C++ Programming Language中的错误?