C++ MSVC 2015为std::vector选择了不正确的构造函数重载

C++ MSVC 2015为std::vector选择了不正确的构造函数重载,c++,gcc,visual-c++,C++,Gcc,Visual C++,下面是我的matrix类的一部分,它具有动态的行数和列数,这个类使用一个std::vector按行主顺序存储矩阵元素 动态矩阵 template<typename _Ty, class _Alloc = std::allocator<_Ty> > class dynamic_matrix { public: typedef _Ty value_type; typedef std::size_t size_type; typedef _Al

下面是我的matrix类的一部分,它具有动态的行数和列数,这个类使用一个
std::vector
按行主顺序存储矩阵元素


动态矩阵

template<typename _Ty,
    class _Alloc = std::allocator<_Ty>
> class dynamic_matrix {
public:
    typedef _Ty value_type;
    typedef std::size_t size_type;
    typedef _Alloc allocator_type;
    // various other typedefs, not relevant here...
    explicit dynamic_matrix(size_type _rows, size_type _cols, const _Alloc& alloc = _Alloc())
        : mtx(_rows*_cols, alloc), rows_(_rows), cols_(_cols) {}
    explicit dynamic_matrix(size_type _rows, size_type _cols, const value_type& _val,
        const _Alloc& alloc = _Alloc()) : mtx(_rows*_cols, _val, alloc), rows_(_rows), cols_(_cols) {}
    // other constructors and methods omitted...
private:
    std::vector<_Ty, _Alloc> mtx;
    size_type rows_;
    size_type cols_;
};
我从MSVC 2015中得到以下错误:

std::vector<_Ty,_Alloc>::vector(std::initializer_list<int>,const std::allocator<_Ty>&)
: cannot convert argument 2 from 'const std::allocator<_Ty>' to 'const int&'
在上面的
dynamic_matrix
代码片段中使用第二个构造函数可以很好地编译GCC和MSVC

问题似乎是,出于某种原因,MSVC将构造函数调用
mtx(\u rows*\u cols,alloc)
解释为第七个构造函数,这将解释
无法从const std::allocator转换为const int&
错误消息。然而,GCC似乎正在按照我的意图使用上述参考中的第三个构造函数


为什么MSVC没有选择正确的构造函数从
std::vector
调用,而GCC正在调用,我可以做些什么来缓解这种情况?

状态更新

该缺陷已修复,并在VS 2015更新3中发布


通过查看MSV中的向量头,没有具有以下形式的构造函数

explicit vector( size_type count, const Allocator& alloc = Allocator() )
但它确实有

explicit vector(size_type _Count)
这是一个C++11添加的构造函数,在C++14中更改为以前的构造函数。MSV似乎还没有赶上这一变化

真正奇怪的是
vector
的专门化在头文件中有正确的构造函数,如果您使用

dynamic_matrix<bool> dm(10, 10);

并提供一个值来构造元素。

如果使用mtx{{u rows*\u cols,alloc}会发生什么情况?恐怕还是会出现同样的错误。如果分配器对您来说不是那么重要,如果您不使用它,它会起作用。实际上。。。如果我查看MSVC中的STL源代码,我没有看到接受计数和分配器的构造函数。我可能误解了这一点,但我认为您尝试使用的构造函数在MSVC中根本不存在,无论是偶然还是偶然。但是,有一个用于计数、填充值和分配器的构造函数,所以你可以考虑使用它。我知道,感谢bug报告——我想MS现在已经应用了这个改变。一定是被忽略了/有人检查过了,但忘了做这项工作;)@班特伯里大主教增加了一个可能的解决方法。是的,那会奏效的,我可以使用这个构造函数,并默认初始化值作为第二个参数。
explicit vector(size_type _Count)
dynamic_matrix<bool> dm(10, 10);
vector( size_type count, 
             const T& value,
             const Allocator& alloc = Allocator());