这并不是真正的错误。问题是在第一段代码无法编译的情况下允许第二段代码可能会出现什么问题?
问题是,虽然您在执行此操作时想要调用哪个构造函数对您来说似乎很明显:
std::vector<std::vector<int>> graph(5, 5);
对于编译器来说并不是那么清楚。特别是有两个构造函数重载可以潜在地接受参数:
vector(size_type,const T& value = T());
template <typename InputIterator>
vector(InputIterator first, InputIterator last);
第一个需要转换5
to size_type
(这是无符号的),而第二个是完美匹配的,所以这将是编译器选择的......
...但是编译器要求第二次重载,如果推导的类型InputIterator
isintegra 的行为就好像它是对以下内容的调用:
vector(static_cast<size_type>(first),static_cast<T>(last))
C++03 标准有效要求的是第二个参数是明确地由原始类型转换而来int
到目的地类型std::vector<int>
。因为转换是显式的,所以会出现错误。
如果参数实际上不是输入迭代器,C++11 标准更改了措辞以使用 SFINAE 禁用迭代器构造函数,因此在 C++11 编译器中应该拒绝代码(这可能是一些人声称这一点的原因)是一个错误)。