2017-08-27 5 views
4

私は、次のコードをしている:範囲ベースのfor-loopの構造化バインディングは、コピーであり参照ではないのはなぜですか?

#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 
} 

私の質問:

は、なぜ最初のassert文は、第二のパスながら通過していないのですか? レンジベースのforループでfoosマップのfooの値を変更できないのはなぜですか?

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

編集:コピーは、Visual Studioプロジェクトに貼り付けた場合、コードは今コンパイルします。

+9

MSVCバグ。バグレポートを提出してください。 –

+0

コンパイルするサンプルプログラムを投稿してください。 –

+0

@ JiveDadson私は自分の投稿を編集しました。 – Jupiter

答えて

0

私はVSにバグレポートを掲載しましたが、現在調査中です。

関連する問題