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++専用という時点で使う気はないですが。