什么是 2D 矢量构建 C++11 中的突破性变化

What is 2D vector construction breaking change in C++11?

本文关键字:突破性 变化 C++11 构建 2D 什么      更新时间:2023-10-16

在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)):[截图错误消息转储]

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 [序列.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问题,这是一个不同的问题。

STL