使用迭代器的初始值设定项列表构造容器

2024-03-21

可以构造一个具有迭代器范围的向量,如下所示:

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, right?


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

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

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

— 如果没有可行的 找到初始化列表构造函数,重载决策为 再次执行,其中候选函数是所有 类的构造函数T参数列表包括 初始化列表的元素。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用迭代器的初始值设定项列表构造容器 的相关文章

随机推荐