Snp*_*nps 7 c++ iterator uniform-initialization c++11
可以使用迭代器范围构造一个向量,如下所示:
std::vector<std::string> vec(std::istream_iterator<std::string>{std::cin},
std::istream_iterator<std::string>{});
Run Code Online (Sandbox Code Playgroud)
但我也可以使用C++ 11统一初始化语法编译和运行代码(注意括号),如下所示:
std::vector<std::string> vec{std::istream_iterator<std::string>{std::cin},
std::istream_iterator<std::string>{}};
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么?
我知道采用初始化列表的构造函数优先于其他形式的构造.编译器是否应该解析为构造函数采用包含2个元素的初始化列表std::istream_iterator
?这应该是一个错误,因为std::istream_iterator
无法转换为矢量值类型std::string
,对吧?
来自§13.3.2/ 1([over.match.list])
当非聚合类类型的对象
T
被列表初始化(8.5.4)时,重载决策分两个阶段选择构造函数:- 最初,候选函数是类的初始化列表构造函数(8.5.4),
T
参数列表由初始化列表作为单个参数组成.- 如果找不到可行的初始化列表构造函数,则再次执行重载解析,其中候选函数是类的所有构造函数,
T
参数列表由初始化列表的元素组成.
在您的情况下,初始化程序列表构造函数被认为是不可行的(因为std::istream_iterator<std::string>
不可转换为std::string
),并且第二个条件适用.这导致构造函数选择2个迭代器.
归档时间: |
|
查看次数: |
796 次 |
最近记录: |