隐式使用初始化列表

3

§[dcl.init.list] 8.5.4/2:

如果在使用std::initializer_list之前没有包含头文件<initializer_list>,即使是隐式使用而未命名类型(7.1.6.4),模板std :: initializer_list未定义。这意味着这个程序是不合规的。

这是否意味着这个程序不合规?

#include <vector>
int main() {
    // uses vector::vector(initializer_list<T>, const Allocator&) constructor
    std::vector<int> v = {1, 2, 3};
}

2
实际上它并不是不良形式,因为std::vector构造函数使用initializer_list,所以必须在<vector>中包含它。但是除非有声明这种依赖关系的地方,否则正式的代码可能会出现错误。原因是标准库允许进行任何类型的魔法操作,包括依赖于编译器的非标准行为,因此不能推断标准库必须以与自己的代码相同的方式实现。 - Cheers and hth. - Alf
1个回答

5

你的程序不是非法的,因为<vector>保证包含<initializer_list>(所有标准库容器都适用于此规则)

§23.3.1 [sequences.general]

头文件<vector>概述

#include <initializer_list>
...

搜索标准库中的#include <initializer_list>,发现该头文件与以下头文件一起被包含。
  • <utility>
  • <string>
  • <array>
  • <deque>
  • <forward_list>
  • <list>
  • <vector>
  • <map>
  • <set>
  • <unordered_map>
  • <unordered_set>
  • <queue>
  • <stack>
  • <algorithm>
  • <random>
  • <valarray>
  • <regex>

1
哪些C标准库头文件保证包含另一个头文件? - T.C.
1
@T.C. 哈!事实证明我甚至在那个答案上给了你赞:)。我会让 OP 决定是否是重复的,因为这个问题特别涉及到 <initializer_list> - Praetorian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接