Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从int到vector的隐式转换?_C++_Visual Studio_Vector_Type Conversion_Explicit Constructor - Fatal编程技术网

C++ 从int到vector的隐式转换?

C++ 从int到vector的隐式转换?,c++,visual-studio,vector,type-conversion,explicit-constructor,C++,Visual Studio,Vector,Type Conversion,Explicit Constructor,vector有一个取向量大小的构造函数,据我所知,它是显式的,这可以通过以下代码无法编译的事实来证明 void f(std::vector<int> v); int main() { f(5); } void f(标准向量v); int main() { f(5); } 我无法理解并要求您解释的是为什么要编译以下代码 std::vector<std::vector<int>> graph(5, 5); std::向量图(5,5); 它不仅进行编

vector
有一个取向量大小的构造函数,据我所知,它是显式的,这可以通过以下代码无法编译的事实来证明

void f(std::vector<int> v);
int main()
{
    f(5);
}
void f(标准向量v);
int main()
{
f(5);
}
我无法理解并要求您解释的是为什么要编译以下代码

std::vector<std::vector<int>> graph(5, 5);
std::向量图(5,5);
它不仅进行编译,实际上还将图形大小调整为5,并将每个元素设置为五个零的向量,即执行与我通常编写的代码相同的操作:

std::vector<std::vector<int>> graph(5, std::vector<int>(5));
std::vector图(5,std::vector(5));
怎么做?为什么?

编译器:MSVC10.0



好吧,看来这是MSVC的一个bug(又是一个)。如果有人能在回答中详细说明这个bug(即总结它被复制的情况),我很乐意接受它

这实际上是一个扩展,而不是bug


被调用的构造函数包含两个迭代器(但实际上,签名将匹配同一类型的任意两个参数);然后,当两个迭代器实际为
int
时,它调用一个专门化,该专门化使用
end
的值显式构造一个
value\u type
,并用它的
begin
副本填充向量。

在我看来,它好像在调用这个构造函数:

template <class InputIterator>
vector (InputIterator first, InputIterator last,
  const allocator_type& alloc = allocator_type());
模板
向量(先输入计数器,后输入计数器,
常量分配器类型&alloc=allocator类型();

我不确定
explicit
是从哪里来的,因为构造函数需要多个参数。它不是从整数到向量的自动转换。

它不是一个真正的bug。问题是,当第一段代码不编译时,允许第二段代码会出现什么问题

问题是,虽然您似乎很清楚在执行此操作时要调用什么构造函数:

std::vector<std::vector<int>> graph(5, 5);
C++03标准有效地要求第二个参数从原始类型
int
显式转换为目标类型
std::vector
。因为转换是显式的,所以会出现错误


C++11标准更改了使用SFINAE禁用迭代器构造函数的措辞,如果参数不是真正的输入迭代器,那么在C++11编译器中,代码应该被拒绝(这可能是一些人声称这是一个错误的原因)。

这(正确地)不能在GCC 4.7上编译。另一个MSVC++非标准的怪异之处。他们可能只是忘了标记构造函数
explicit
,你可以深入
来检查它。@syam:我很高兴它在GCC上编译失败,但真正奇怪的是第一个示例在MSCV上编译,而另一个没有。这才是真正的原因strange@ArmenTsirunyan都不是在VS2012上编译的;错误消息说明构造函数是显式的,为什么不查看库源代码?@jrok:我看了-构造函数是显式的,但代码没有被拒绝我想我不明白。。。int作为迭代器意味着什么?@ArmenTsirunyan:
std::vector
有一个接受开始和结束迭代器的构造函数。它的定义类似于
模板向量(\u It first,\u It last)
,与您的调用相匹配。然后它根据
\u It
的类型调用一个具有各种重载的函数,其中一个重载处理
\u It
int
的情况。回答你的问题,它不是迭代器,但代码处理你给它一个int的情况。如果你说的是真的,那就是我见过的最糟糕的扩展。(我担心这有点扭曲的意义,虽然)它不是C++03标准所要求的这种行为的真正扩展。该标准明确禁止使用两个迭代器构造函数,而另一个构造函数也可能是匹配的。我想我不明白。。。int是一个输入迭代器吗?
inputierator
只是一个模板参数-它可以是任何类型。@MarkB这很可能是真的-我对std库的了解不是很广泛。我只是说编译器似乎在做什么,而不是它应该做什么。
vector(size_type,const T& value = T());

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