std::vector::insert() 在从 MSVC 2013 (C++11) 迁移到 MSVC 2019 (C++17) 时停止工作
std::vector::insert() stopped working when migrating from MSVC 2013 (C++11) to MSVC 2019 (C++17)
我目前正在从
迁移一个大型代码库
- 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";
}
在 VS2013 中生成单元素向量,但在 VS2019 中生成空向量。
其他插入方式
nestedVector.insert(nestedVector.begin(), std::vector<int>{});
nestedVector.insert(nestedVector.begin(), std::vector<int>());
在两种设置中工作并正确添加新元素。这里发生了什么?
正如评论中已经提到的,在您的原始程序中 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 );
在向量中创建一个元素。这是错误的行为。
我目前正在从
迁移一个大型代码库- 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";
}
在 VS2013 中生成单元素向量,但在 VS2019 中生成空向量。
其他插入方式
nestedVector.insert(nestedVector.begin(), std::vector<int>{});
nestedVector.insert(nestedVector.begin(), std::vector<int>());
在两种设置中工作并正确添加新元素。这里发生了什么?
正如评论中已经提到的,在您的原始程序中 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 );
在向量中创建一个元素。这是错误的行为。