缺少包含不会在 RedHat 6 上产生编译错误

Missing include gives no compile error on RedHat 6

此代码段无法编译,因为 std::accumulate 在 header numeric 中找到,而 numeric 未包含在内。

#include <algorithm>
#include <vector>

int main () {
    std::vector<int> vec{ 1, 2, 3, 4 };
    return std::accumulate(vec.begin(), vec.end(),0);
}

compiler explorer 给出了正确的错误信息

<source>(6): error: namespace "std" has no member "accumulate"
      return std::accumulate(vec.begin(), vec.end(),0);

我使用的是 RedHat 6 和 intel 编译器版本 18.0.3。如果我用这个设置编译它,我不会出错并且结果很好。即使使用 -Wall 也不会显示警告。

我的问题是,为什么我没有收到相应的错误消息?

why don't I get an appropriate error message?

因为您用于编译的标准库头文件之一 <algorithm><vector> 确实包含 <numeric> 本身。这是一个常见的可移植性问题;您的代码恰好使用特定的标准库实现进行编译,但无法使用另一个实现进行构建。库实现可以自由地将标准头文件包含在标准头文件中。也许您 <algorithm> 中的某些功能是使用任何 <numeric> 算法实现的,而您就是这样。

您遇到的编译器错误是 include-what-you-use 等工具存在的原因。使用 iwyu her 会将 #include <numeric> 添加到您的代码段中。另请注意,没有警告标志会影响编译结果。要么出现硬编译器错误,要么什么都没有。