什么是C ++ 11中的2D矢量构造破坏变化?

时间:2012-06-22 11:51:55

标签: c++ c++11

在阅读one question on MS Connect site的答案时,我注意到以下部分的回复:

  

这是我在标准库中的一些重大变化之一   意识到(其他主要的是不可变的集合,以及 2D向量   构造)。

答案可以被认为具有高概率,因为它来自MS员工,致力于实施STL。

那么有人知道他到底指的是什么吗?

1 个答案:

答案 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),其中Tvector<int>。但是,这会尝试将22隐式转换为临时vector<int>(以便将其绑定到const T&)。 vector的大小构造函数的显式性禁止这样做。

阅读the other SO question,这是一个不同的问题。

STL