使用迭代器的初始化列表构造容器

时间:2013-07-31 20:03:57

标签: c++ c++11 iterator uniform-initialization

可以使用迭代器范围构造一个向量,如下所示:

std::vector<std::string> vec(std::istream_iterator<std::string>{std::cin},
                             std::istream_iterator<std::string>{});

但是我也可以使用C ++ 11统一初始化语法编译和运行代码(注意括号),如下所示:

std::vector<std::string> vec{std::istream_iterator<std::string>{std::cin},
                             std::istream_iterator<std::string>{}};

这里到底发生了什么?

我知道使用初始化列表的构造函数优先于其他形式的构造。编译器是否应该解析为构造函数采用包含2个std::istream_iterator元素的初始化列表?这应该是一个错误,因为std::istream_iterator无法转换为向量值类型std::string,对吗?

1 个答案:

答案 0 :(得分:5)

来自§13.3.2/ 1([over.match.list])

  

当非聚合类类型T的对象被列表初始化时   (8.5.4),重载决策分两个阶段选择构造函数:

     

- 最初,候选函数是初始化列表   类T的构造函数(8.5.4)和参数列表包含   初始化列表作为单个参数。

     

- 如果没有可行性   找到初始化列表构造函数,重载解析是   再次执行,其中候选函数都是   类T的构造函数和参数列表包含   初始化列表的元素。

在您的情况下,初始化列表构造函数被认为是不可行的(因为std::istream_iterator<std::string>不能转换为std::string),并且第二个条件适用。这导致构造函数选择2个迭代器。