【发布时间】:2019-08-27 05:36:32
【问题描述】:
#include <iostream>
#include <vector>
int main()
{
auto v1 = std::vector<std::size_t>(std::size_t{8});
std::cout << v1.size() << std::endl;
auto v2 = std::vector<std::size_t>{std::size_t{8}};
std::cout << v2.size() << std::endl;
}
代码输出:
8
1
我知道这是 C++ 中的一个众所周知的问题,因为:
std::vector<std::size_t>(std::size_t{8}) 来电
explicit vector(size_type count) 而
std::vector<std::size_t>{std::size_t{8}} 来电
vector(std::initializer_list<T> init, const Allocator& alloc = Allocator()).
令我惊讶的是:
为什么第二次调用不会因为重载解析不明确而触发编译时错误?
In another related question,一段类似的代码确实会引发歧义错误。
【问题讨论】:
-
大括号
{}的使用使其明确。如果可用,它将始终使用std::initializer_list构造函数。 -
为什么这个会触发歧义错误? stackoverflow.com/questions/41507602/…
-
如果类型匹配,initializer_list 具有更高的优先级
标签: c++ c++11 initializer-list ambiguous overload-resolution