[visual-studio]从 int 为矢量的隐式转换吗?

标签: Visual-Studio
发布时间: 2014/3/1 3:51:29
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

vector<T>有的构造函数的向量,大小,据我所知它是明确,可以证明的是,下面的代码编译失败,

void f(std::vector<int> v);
int main()
{
    f(5);
}

我不能理解的请你解释就是为什么下面的代码编译

std::vector<std::vector<int>> graph(5, 5);

不仅不会,它编译,它实际上调整到 5 图的大小并将每个元素设置为载体的五个零,即不会一样一样的代码,我通常会写:

std::vector<std::vector<int>> graph(5, std::vector<int>(5));

如何?为什么呢?

编译器: MSVC10.0


好的似乎是 MSVC bug (但另一个)。如果有人能详细的答案中的错误 (即汇总哪里就转载的案件) 我会高兴地接受它

解决方法 1:

它真的不是一个 bug。问题是代码的怎么能有错,允许第二次段,虽然第一次将不能编译?

问题是虽然似乎显而易见,你什么构造函数你想打电话给你的时候:

std::vector<std::vector<int>> graph(5, 5);

它不是那么清楚的编译器。特别是有两个潜在可接受参数的构造函数重载:

vector(size_type,const T& value = T());

template <typename InputIterator>
vector(InputIterator first, InputIterator last);

第一个需要转换的 5size_type (这是无符号),虽然第二个是完美匹配,以便将由编译器拾一......

......,但编译器需要第二个重载,如果推导的类型 InputIterator 是积分的行为就像是对的调用:

vector(static_cast<size_type>(first),static_cast<T>(last))

标准的 C + + 03 有效授权从原始类型的第二个参数显式转换 int 为目标类型 std::vector<int> 。因为转换是显式的你遇到的错误。

C + + 11 标准更改的措辞要使用 SFINAE 禁用的迭代器构造函数,如果该参数不是真的输入迭代器,所以在 C + + 11 的编译器代码应被拒绝 (这可能是有些人说这是一个 bug 的原因)。

官方微信
官方QQ群
31647020