从MSVC 2013(C ++ 11)迁移到MSVC 2019(C ++ 17)时std :: vector :: insert()停止工作

Phi*_*Lab 7 c++ visual-studio visual-c++ c++17 msvc14

我目前正在从迁移大型代码库

  • Visual Studio 2013(v120)
  • C ++ 11

  • Visual Studio 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";
}
Run Code Online (Sandbox Code Playgroud)

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

其他插入方式

nestedVector.insert(nestedVector.begin(), std::vector<int>{});
nestedVector.insert(nestedVector.begin(), std::vector<int>());
Run Code Online (Sandbox Code Playgroud)

在这两种设置中均可正常工作,并正确添加新元素。这是怎么回事

Fed*_*dor 3

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

iterator insert( const_iterator pos, std::initializer_list<T> ilist );
Run Code Online (Sandbox Code Playgroud)

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

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

显然,VS2013没有实现这个insert方法的重载,所以另一个调用:

iterator insert( const_iterator pos, const T& value );
Run Code Online (Sandbox Code Playgroud)

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