Похоже, что конструкторы перемещения unordered_set/map в VC10 (Visual Studio 2010) переводят правую часть в неопределенное состояние после вызова, что приводит к сбою других операций (таких как «вставка»). Операторы присваивания перемещения работают нормально. Однако нормальный набор/карта, кажется, ведет себя правильно во всех случаях. Кроме того, все работает нормально в VC11 (Visual Studio 2012).
Это ошибка реализации _Hash в VC10 или я что-то упускаю? Заранее спасибо за любой вклад!
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
std::set<int> si0;
std::unordered_set<int> usi0;
std::map<int, int> mii0;
std::unordered_map<int, int> umii0;
int _tmain(int argc, _TCHAR* argv[])
{
si0.insert(0);
si0.insert(1);
si0.insert(2);
std::set<int> si( std::move(si0) ); // fine!
si0.insert(666);
usi0.insert(0);
usi0.insert(1);
usi0.insert(2);
//std::unordered_set<int> usi( std::move(usi0) ); // this seems to put usi0 to an undefined state, which makes 'insert' below cry!
std::unordered_set<int> usi; usi = std::move(usi0); // this works!
usi0.insert(666);
mii0[0] = 0;
mii0[1] = 1;
mii0[2] = 2;
std::map<int, int> mii( std::move(mii0) ); // fine!
mii0[666] = 666;
umii0[0] = 0;
umii0[1] = 1;
umii0[2] = 2;
//std::unordered_map<int, int> umii( std::move(umii0) ); // this seems to put umii0 to an undefined state, which makes 'insert' below cry!
std::unordered_map<int, int> umii; umii = std::move(umii0); // this works!
umii0[666] = 666;
return 0;
}