为什么在基于范围的for循环中的结构化绑定只是一个副本而不是参考?

问题描述:

我有以下代码:为什么在基于范围的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 
} 

我的问题:

为什么不先断言语句传递,而第二遍? 为什么无法在基于范围的for循环中更改foos映射中的foo的值?

编译: MSVS ++ 17的Visual Studio 15.3.2

编辑:现在的代码编译,如果复制粘贴到一个Visual Studio项目。

+9

MSVC错误。提交错误报告。 –

+0

请发布一个将编译的示例程序。 –

+0

@JiveDadson我编辑了我的帖子。 – Jupiter

我在VS发布了一个bugreport,现在正在调查中。