首页 > 解决方案 > 为什么不包含 initializer_list 头文件时没有编译错误?

问题描述

我刚刚看到有人的博客写了这个示例代码,说明了 initializer_list 的简单用法,出现在 C++11 中:

#include <iostream>
//#include <initializer_list>
using namespace std;

void print(initializer_list<int> list) {
    for(auto it = list.begin(); it!=list.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}

int main() {
    print({1,2,3,4,5,6,7});
    return 0;
}

但是,我在 Ubuntu16.04 下用 g++-5.4 和 clang++-8 测试过,也用 Visual Studio 2017 测试过,它们都编译正常,没有任何编译错误#include <initializer_list>我徘徊为什么不需要注释掉。

我的编译命令:

g++ main.cpp -std=c++11 -Wall

通过不包含initializer_list头文件,C++ 编译器如何找到它的定义?

而且也很困惑,我什么时候应该强制包含initializer_list头文件?

在VS2017下想通了。这是一个很长的包括。

iostream <- istream <- ostream <- ios <- xcolumn <- streambuf <- xiosbase <- xlocale <- stdexcept <- xstring <- xmemory0 <- xutility <- utility <- xstddef <- initializer_list

标签: c++11header-files

解决方案


不包括<initializer_list>未定义的行为。它在这种情况下有效,因为在此特定实现中<iostream>包含它,但不是必须这样做。


推荐阅读