我刚刚看到有人的博客写了这个示例代码,演示了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 2017进行了测试,它们都编译OK,而没有任何编译错误。我想知道为什么不需要注释掉#include <initializer_list>。
我的编译命令:
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
发布于 2020-04-09 03:20:26
没有编译器错误,因为包含<iostream>也将包括<initializer_list>。
发布于 2020-04-09 04:25:41
不包括<initializer_list>是未定义的行为。在这种情况下,它可以工作,因为在这个特定的实现中,<iostream>包括它,但是它不需要这样做。
发布于 2020-04-09 03:20:34
应该通过<iostream>报头将其包括在内,因为它是经常使用的头,或者编译器在默认情况下可能是包含的,原因也是相同的。
您可能只希望在编译器抱怨时才添加<initializer_list>。
https://stackoverflow.com/questions/61113394
复制相似问题