web-dev-qa-db-ja.com

範囲ベースのforループの構造化バインディングが単なるコピーであり、参照ではないのはなぜですか?

私は次のコードを持っています:

#include "stdafx.h"
#include <unordered_map>
#include <cassert>
int main()
{
    struct Foo { int a; };
    std::unordered_map<int, Foo> foos{ { 0, { 3 } }, { 1, { 4 } } };
    for (auto &[i, foo] : foos)
    {
        foo.a = 6; //doesn't change foos[i].a
        assert(&foo.a == &foos[i].a); //does not pass
    }

    auto &[i, foo] = *foos.begin();
    foo.a = 7; //changes foo[0].a
    assert(&foo.a == &foos[0].a); //passes
}

私の質問:

2番目が通過するのに最初のassertステートメントが通過しないのはなぜですか?範囲ベースのforループのfooマップのfoosの値を変更できないのはなぜですか?

コンパイラ: MSVS ++ 17 Visual Studio 15.3.2

編集:Visual Studioプロジェクトにコピーを貼り付けると、コードがコンパイルされるようになりました。

14
Jupiter

bugreport をVSに投稿しましたが、現在調査中です。

6
Jupiter