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プロジェクトに貼り付けた場合、コードは今コンパイルします。
MSVCバグ。バグレポートを提出してください。 –
コンパイルするサンプルプログラムを投稿してください。 –
@ JiveDadson私は自分の投稿を編集しました。 – Jupiter