c++ - 为什么基于范围的 for 循环中的结构化绑定(bind)只是拷贝而不是引用?

标签 c++ for-loop visual-c++ c++17 structured-bindings

我有以下代码:

#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 项目中,代码现在可以编译。

最佳答案

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

关于c++ - 为什么基于范围的 for 循环中的结构化绑定(bind)只是拷贝而不是引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907922/

相关文章:

c++ - 简单堆程序——这个变量做什么

c++ - 你应该有一个调用其他内部函数的类接口(interface)函数吗?

c++ - CONFUSED -- c++ 第 3 方库,c++ 新手

arrays - 如何使用 for 循环加速数组中的字符串比较?

c# - for循环直接跳到最后

windows - pthread win32版本? ( Mongoose )

c++ - 如何解决变量初始化C++的警告

php - 在 for 循环中按字段值返回最常见的结果?

visual-studio-2008 - 你能在加载的项目上制作一个 VC++ 解决方案集预处理器 #defines 吗?

windows - 有没有办法检测 Windows 操作系统是服务器 (2003/2008) 还是工作站 (XP/Vista/Win7)?