<algorithm>包括<cmath>吗?

fon*_*ini 5 c++ standards c++-standard-library c++11

以下程序正确编译:

#include <algorithm>

int main(int argc, char *argv[]) {

    return int(log(23.f));

}
Run Code Online (Sandbox Code Playgroud)

(根据g ++ 4.9.2与旗帜-std=c++11)

代码使用log定义的函数<cmath>.但是,它不包括标题<cmath>,只包括标题<algorithm>.为什么g++不提供任何警告,并正确编译代码?

Lin*_*gxi 9

根据标准,一些标题确实包含其他标题.例如,<cinttypes>包括<cstdint>.请参阅包括部分在这里.关于<algorithm>,它没有这样的陈述,它应该包括哪些其他标题(见这里).因此,结论是,<algorithm>不需要包含<cmath>,并且您的示例代码不可移植.它可能无法在其他C++实现上编译.


Col*_*mbo 6

在C++ 11标准中,[res.on.headers]/1表示

C++标头可能包含其他C++标头.C++标头应提供其概要中出现的声明和定义.在其概要中显示的包含其他C++头的C++头应提供出现在那些其他头的概要中的声明和定义.

现在考虑[algorithms.general]/2:

标题<algorithm>简介

#include <initializer_list>

namespace std {
  // ......
Run Code Online (Sandbox Code Playgroud)

<cmath>没有列出,也没有列入<initializer_list>.因此,您的程序无法保证在符合标准的实现上进行编译.人们不应该依赖"隐含包含" - 一般准则是包括使用实体的每个标题.
例外<iostream>包括<ostream>,这是自C++ 11以来的保证.