【问题标题】:C++: Why is std::greater<T>() included in iostream?C++:为什么 std::greater<T>() 包含在 iostream 中?
【发布时间】:2019-10-06 19:17:30
【问题描述】:

我注意到包含 std::greater&lt;T&gt;() 的 C++ 代码在不包含 &lt;functional&gt; 的情况下编译良好。这让我开始思考。原来这段代码可以编译:

#include <iostream>
int main(){
    std::greater<T>();
}

但是这个没有:

int main(){           //<iostream> doesn´t get included
    std::greater<T>();
}

由此我可以推断出&lt;iostream&gt; 包含std::greater,这对我来说似乎有些奇怪。谁能解释一下,为什么std::greater&lt;T&gt;() 会包含在&lt;iostream&gt; 中?

如果这很重要,我正在使用带有 C++14 的 g++(x86_64-posix-seh-rev0,由 MinGW-W64 项目构建)8.1.0。

【问题讨论】:

    标签: c++


    【解决方案1】:

    它不受 ISO 标准的保证。该标头的实现使用它。 您还可能会发现&lt;utility&gt;&lt;string&gt;(可能包含在&lt;ios&gt;&lt;iosfwd&gt; 中)、&lt;memory&gt; 和一些&lt;type_traits&gt; 可以从&lt;iostream&gt; 获得。

    五个保证的标头是(C++11 起):ios、iosfwd、istream、ostream、streambuf。

    【讨论】:

    • g++ 中有一个标志来禁用它吗?我认为依赖 的特定实现是不好的做法,当库不属于最小 时,我希望编译器通知我。
    • @mondlos 不,没有这样的标志。我很抱歉,但这不是编译器对程序员做一些可能的事情的特权。这是开发人员政策、公司编码标准等的一部分。如果你不想依赖它,那就不要。您可以单独包含标题,它们都受到适当的保护。
    • @mondlos 您可能需要像include-what-you-use 这样的工具来分析代码以使其尽可能可移植。
    猜你喜欢
    • 2011-12-22
    • 2021-10-29
    • 2018-09-18
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2020-10-29
    相关资源
    最近更新 更多