Re: for each バグ
http://d.hatena.ne.jp/faith_and_brave/20080514/1210755507
これ、mapとかキーとかは関係ないと思います。
#include <iostream> struct hoge { hoge() { std::cout << static_cast<void*>(this) << "\thoge()" << std::endl; } hoge(int n) { std::cout << static_cast<void*>(this) << "\thoge(" << n << ')' << std::endl; } hoge(const hoge&) { std::cout << static_cast<void*>(this) << "\thoge(const hoge&)" << std::endl; } ~hoge() { std::cout << static_cast<void*>(this) << "\t~hoge()" << std::endl; } hoge& operator=(const hoge&) { std::cout << static_cast<void*>(this) << "\toperator=(const hoge&)" << std::endl; return *this; } }; int main() { int a[] = { 1 }; // VC++拡張 for each(const hoge& h in a) std::cout << static_cast<const void*>(&h) << std::endl; }
実行例:
0012FF2F hoge(1) 0012FF2F ~hoge() 0012FF2F
見て分かる通り、int型の要素からhoge型の一時オブジェクトが作られてhはそれを参照しているんですが、for eachブロックに入る前にオブジェクトは死んでいます。
で、コピー(っぽいもの)を作ってる時点で参照で受ける意味はなく、値で受ければよいわけで、個人的にはVC++を直す必要はないかなぁと思います。
むしろコンパイルエラーにしてもいいぐらいです。
まぁ、自分はVC++専用という時点で使う気はないですが。