8

我目前正在从

  • 视觉工作室 2013 (v120)
  • C++11

  • 视觉工作室 2019 (v142)
  • C++17

现在,我的测试在奇怪的地方失败了——我的索引越界崩溃和其他奇怪的行为变化。挖掘后,我注意到以下代码:

#include <iostream>
#include <vector>

int main()
{
    std::vector<std::vector<int>> nestedVector;
    nestedVector.insert(nestedVector.begin(), {});
    std::cout << nestedVector.size() << " elements";
}

在 VS2013 中生成一个单元素向量,但在 VS2019 中生成一个空向量

其他插入方式

nestedVector.insert(nestedVector.begin(), std::vector<int>{});
nestedVector.insert(nestedVector.begin(), std::vector<int>());

在两种设置中工作并正确添加新元素。这里发生了什么?

4

1 回答 1

3

正如评论中已经提到的,在您的原始程序中,调用nestedVector.insert(nestedVector.begin(), {})选择重载方法:

iterator insert( const_iterator pos, std::initializer_list<T> ilist );

请参阅https://en.cppreference.com/w/cpp/container/vector/insert

由于初始值设定项列表为空,因此实际上没有插入任何内容,并且向量大小最后为零。在所有编译器中都是相同的行为,演示:https ://godbolt.org/z/9nnET5ren

显然,VS2013 并没有实现这个insert方法重载,所以另外一个叫:

iterator insert( const_iterator pos, const T& value );

在向量中创建一个元素。这是错误的行为。

于 2021-10-13T07:52:17.297 回答