为什么枚举不能用作此向量构造函数中的参数?

Pau*_*zak 14 c++ stl c++11 visual-studio-2013

这段代码片段:

enum {N = 10, M = 100};

vector<int> v(N, M);
Run Code Online (Sandbox Code Playgroud)

由于以下错误,无法使用Visual Studio 2013进行编译:

错误C2838:'iterator_category':成员声明中的非法限定名称

它出什么问题了?

Mar*_* A. 12

这是VS2012和VS2013中的一个错误,因为它不符合C++ 11标准(_HAS_CPP0X定义为1):

C++ 03 23.1.1 [lib.sequence.reqmts]/9说:

对于本节和第21节中定义的每个序列:

- 构造函数 template <class InputIterator> X(InputIterator f, InputIterator l, const Allocator& a = Allocator())应具有与以下相同的效果:

X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a)如果InputIterator是一个整体类型.

但是来自C++ 11 23.2.3 [sequence.reqmts]/14:

对于本条款和第21条中定义的每个序列容器:

- 如果template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())使用InputIterator不符合输入迭代器的类型调用构造函数,则构造函数不应参与重载决策.

根本不应该考虑那个构造函数

更多信息:https://stackoverflow.com/a/12432482/1938163

作为一种解决方法,您可以" 稍微帮助过载分辨率 ",例如

std::vector<int> v(static_cast<std::vector<int>::size_type>(N), M);
Run Code Online (Sandbox Code Playgroud)


pmr*_*pmr 10

从C++ 11开始,如果两个参数不是迭代器,则应该禁用vector接受两个的构造InputIterators函数.VS2013无法正确实现此功能.