3

在阅读MS Connect 网站上的一个问题的答案时,我注意到回复的以下部分:

这是我所知道的标准库中的一些重大更改之一(其他主要更改是不可变集和2D 矢量构造)。

答案很可能被认为是合法的,因为它来自致力于实施 STL 的 MS 员工。

那么有人知道他具体指的是什么吗?

4

1 回答 1

4

我给斯蒂芬发了电子邮件,问他在说什么。这是他的答案(为格式化而编辑)。听起来他并不打算在这里发布答案。如果他这样做,我会删除这个副本。

从这里开始的一切都是斯蒂芬说话。

我指的是这个:

#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

于 2012-09-14T21:54:40.750 回答