VC10 (Visual Studio 2010) での unordered_set/map の移動コンストラクターは、呼び出された後に右側を未定義の状態にし、他の操作 (「挿入」など) が惨めに失敗するようです。移動代入演算子はうまく機能しているようです。ただし、法線セット/マップはすべての場合で正しく動作するようです。さらに、VC11 (Visual Studio 2012) ではすべて正常に動作しているようです。
これは VC10 での _Hash 実装のバグですか、それとも何か不足していますか? ご意見をお寄せいただきありがとうございます。
#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;
}