首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当不包括initializer_list头文件时,为什么没有编译错误?

当不包括initializer_list头文件时,为什么没有编译错误?
EN

Stack Overflow用户
提问于 2020-04-09 03:17:01
回答 3查看 40关注 0票数 0

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

代码语言:javascript
复制
#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 2017进行了测试,它们都编译OK,而没有任何编译错误。我想知道为什么不需要注释掉#include <initializer_list>

我的编译命令:

代码语言:javascript
复制
g++ main.cpp -std=c++11 -Wall

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

同样令人困惑的是,何时应该强制包含initializer_list头文件?

在VS2017下算出。很长一段时间。

istream <- istream <- ostream <- ios <- x列<- xiosbase <- xlocale <- stdexcept <- xstring <- xmemory0 <- x实用程序<-实用程序<- xstddef <- initializer_list

EN

回答 3

Stack Overflow用户

发布于 2020-04-09 03:20:26

没有编译器错误,因为包含<iostream>也将包括<initializer_list>

票数 0
EN

Stack Overflow用户

发布于 2020-04-09 04:25:41

不包括<initializer_list>是未定义的行为。在这种情况下,它可以工作,因为在这个特定的实现中,<iostream>包括它,但是它不需要这样做。

票数 0
EN

Stack Overflow用户

发布于 2020-04-09 03:20:34

应该通过<iostream>报头将其包括在内,因为它是经常使用的头,或者编译器在默认情况下可能是包含的,原因也是相同的。

您可能只希望在编译器抱怨时才添加<initializer_list>

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61113394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档