在阅读MS Connect 网站上的一个问题的答案时,我注意到回复的以下部分:
这是我所知道的标准库中的一些重大更改之一(其他主要更改是不可变集和2D 矢量构造)。
答案很可能被认为是合法的,因为它来自致力于实施 STL 的 MS 员工。
那么有人知道他具体指的是什么吗?
在阅读MS Connect 网站上的一个问题的答案时,我注意到回复的以下部分:
这是我所知道的标准库中的一些重大更改之一(其他主要更改是不可变集和2D 矢量构造)。
答案很可能被认为是合法的,因为它来自致力于实施 STL 的 MS 员工。
那么有人知道他具体指的是什么吗?
我给斯蒂芬发了电子邮件,问他在说什么。这是他的答案(为格式化而编辑)。听起来他并不打算在这里发布答案。如果他这样做,我会删除这个副本。
从这里开始的一切都是斯蒂芬说话。
我指的是这个:
#include <vector>
using namespace std;
int main() {
vector<vector<int>> v(11, 22);
}
它使用 VC10 SP1(遵循 C++03)编译,但不使用 VC11 RTM(遵循 C++11):[snip error message dump]
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)
ifInputIterator
是整数类型。
这转换vector<vector<int>> v(11, 22)
为vector<vector<int>> v(static_cast<size_t>(11), static_cast<vector<int>>(22))
,这是有效的。(static_cast
能够调用显式构造函数,例如vector
's size 构造函数。)
C++11 23.2.3 [sequence.reqmts]/14说:
对于本条和第 21 条中定义的每个序列容器:
— 如果使用不符合输入迭代器条件
template <class InputIterator> X(InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type())
的类型调用构造InputIterator
函数,则构造函数不应参与重载决策。
这会将 (InIt, InIt) ctor 从重载决议中移除。那叶子(size_type n, const T& value)
,在T
哪里vector<int>
。但是,这会尝试隐式转换22
为临时的vector<int>
(以便将其绑定到const T&
)。的大小构造函数的明确性vector
禁止这样做。
阅读其他 SO question,这是一个不同的问题。
STL