在阅读one question on MS Connect site的答案时,我注意到以下部分的回复:
这是我在标准库中的一些重大变化之一 意识到(其他主要的是不可变的集合,以及 2D向量 构造)。
答案可以被认为具有高概率,因为它来自MS员工,致力于实施STL。
那么有人知道他到底指的是什么吗?
答案 0 :(得分: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)
如果InputIterator
是一个整数类型。
将vector<vector<int>> v(11, 22)
转换为vector<vector<int>> v(static_cast<size_t>(11), static_cast<vector<int>>(22))
,这是有效的。 (static_cast
能够调用显式构造函数,如vector
的大小构造函数。)
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
的大小构造函数的显式性禁止这样做。
阅读the other SO question,这是一个不同的问题。
STL