C++:std"神奇地"在那里?总是?

dan*_*451 5 c++ stl c++11

作为一名C++初级程序员,我注意到无论您使用什么IDE /编译器,您都不需要显式包含stl(标准模板库).这是否意味着我可以依靠stl"始终可用"?

我的意思是,如果我想使用std::cout例如,我只包括iostreamstl 的一部分:

#include <iostream>
Run Code Online (Sandbox Code Playgroud)

......并且不需要像#include <std>以前那样继续做类似的事情:

std::cout << "Hello world!" << std::endl;
Run Code Online (Sandbox Code Playgroud)

此外:我可以依靠stl的一致性吗?stl的每个函数/方法是否总是以相同的方式运行?或者C++版本,操作系统或编译器之间是否有任何变化?

我问这个问题,因为当你不知道某些陷阱时,其他图书馆有时真的很痛苦.例如,Eigen(对于线性代数的东西)对我来说真的很难实现,我注意到一些版本之间改变行为......

Bat*_*eba 9

是的,尽管允许仅提供子集的独立实现有特殊限制,但C++标准库必须随每个C++编译器一起提供,因为它是语言规范的一部分.(最初作为C++扩展的东西最初被称为标准模板库,但现在更好的术语是C++标准库.)

C++标准库指定得非常好 - 您总是需要包含各种头文件以引入标准库组件.您需要的标头不会从编译器更改为编译器.在这方面,它与机器无关.

随着标准的发展,理念是最小化兼容性中断,但也有一些:例如,在C++ 11中重新定义auto关键字,以及从该标准开始弃用std :: auto_ptr.

大多数组件确实位于保留命名空间std中 - 某些功能不是出于遗留原因.最后,最好使用std :: explicit而不是通过使用将整个std命名空间引入全局std命名空间

using namespace std;
Run Code Online (Sandbox Code Playgroud)

否则,您的代码容易受到命名空间歧义的影响.

  • 教程总是这样做是为了清晰,但它在大型代码库中是一个灾难. (5认同)
  • "C++标准库必须随每个C++编译器一起提供,因为它是语言规范的一部分" - 这对于"托管实现"是正确的,但嵌入式世界通常使用不包括标准库的"独立实现".该标准允许两种类型.当然,初学者不太可能遇到独立实施. (3认同)
  • 我总是要质疑任何教程的方法:如果教程不想从一开始就展示出良好的C++编程实践,它有什么真正的价值? (2认同)