什么是 2D 矢量构建 C++11 中的突破性变化
What is 2D vector construction breaking change in C++11?
在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
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么预减量会导致奇怪的变化?
- MATLAB:跟踪imufilter对象中的状态变化
- 当父小部件大小发生变化时,如何更改子小部件的大小?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 为什么使用默认构造函数"{}"而不是"= default"存在性能变化?
- 什么是 2D 矢量构建 C++11 中的突破性变化