Visual Studio 2010 のコードを考えると:
void Foo::Bar() const
{
map_t::const_iterator iter(my_map_.find(key));
if(my_map_.end() != iter)
DoStuff(iter->second);
}
Do stuff は、mapped_type を値で受け取ります。マップされた型は、コピー可能、移動可能、割り当て可能な型です。
2 番目にアクセスしようとすると、キーと値のペアをコピーできないというエラー メッセージが表示されます。私が自分の行に書いても:
iter->second;
(*iter).second;
DoStuffとは何の関係もないことを確認するために...
operator-> または operator* を返す前に、イテレータがキーと値のペアのコピーを作成していると思います。
マップされた型のコピーを取得するにはどうすればよいですか?
編集:
マップ自体は、大まかに次のように、バリアントをブーストするための unsigned short です。
typedef struct{} empty_t;
typedef boost::variant<empty_t, double, long, some POD types> variant_t;
typedef std::map<unsigned short, variant_t> map_t;
そして、クラスのプライベート メンバーとして:
map_t my_map_;
明確にするために、問題は DoStuff に渡すことではありません。その行を削除して、単純にイテレータを逆参照して 2 番目にアクセスすると、コンパイラ エラーが発生します。
if(my_map_.end() != iter)
iter->second; //Doesn't do anything, but illustrates the error.