c++11 - 为什么不包含 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
解决方案
不包括<initializer_list>
未定义的行为。它在这种情况下有效,因为在此特定实现中<iostream>
包含它,但不是必须这样做。
推荐阅读
- javascript - 问:Service Worker 在浏览器中工作,但不能作为 PWA
- javascript - 如何在 div 中加载外部 URL(文本)
- c# - 如何在正则表达式 c# 中匹配字符串格式
- android - BroadcastReceiver 未从 ACTION_BATTERY_CHANGED 更新
- php - 我可以在不使用 API 的情况下在 Wordpress 中创建盐键吗?
- javascript - 当元素在移动设备上上下滑动时,过渡是生涩的?
- git - 无法将提交推送到 GitHub 上新创建的存储库
- python - 查找数组中最小值的索引,其中相同的索引指向另一个数组中的零
- android - 每 1 秒更新片段中的 textview
- angular - AuthGuard 路由器角度