c++ - 通过非自动非常量左值引用时,for_each、map 和 lambda 出错

标签 c++ lambda foreach reference auto

在下面的代码中,第一个 for_each 语句给出了 GCC 7.2 的错误,其中一些说:

cannot bind non-const lvalue reference of type 'std::pair&' to an rvalue of type 'std::pair'

#include <algorithm>
#include <iostream>
#include <map>

int main() {
  std::map<int, double> m = { {1, 1.0}, {2, 2.0}, {3, 3.0} };

  std::for_each(std::begin(m), std::end(m),
                [](std::pair<int, double>& e){ e.second += 1.0; }); // ERROR

  std::for_each(std::begin(m), std::end(m),
                [](auto& e){ e.second += 1.0; }); // OK

  for (auto iter = std::begin(m); iter != std::end(m); ++iter)
    iter->second += 1.0;

  for (auto & e : m)
    e.second += 1.0;

  for (auto & [ key, value ] : m)
    value += 1.0;

  std::cout << m[1] << ", " << m[2] << ", " << m[3] << std::endl;
}

是什么导致了这个错误?它如何与 auto 一起工作,即在第二个 for_each 语句中?

根据这个答案:https://stackoverflow.com/a/14037863/580083第一个 for_each 应该可以工作(而且我还找到了另一个说同样的话的答案)。

在线验证码:https://wandbox.org/permlink/mOUS1NMjKooetnN1

最佳答案

你不能修改 std::map 的键,所以你应该使用

  std::for_each(std::begin(m), std::end(m),
            [](std::pair<const int, double>& e){ e.second += 1.0; });

关于c++ - 通过非自动非常量左值引用时,for_each、map 和 lambda 出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47260470/

相关文章:

c++ - 使用 string.find() 确定第 i 个 "str"的位置

c# - AutoMapper Project().To<T> 和可重用的 lambda 表达式

c# - 为范围内的每个索引做一些事情

PHP MySQL 循环/Foreach

php - 使用 XML 提取 XML 中的 ECB 汇率时遇到一些问题..有问题的完整源代码

c++ - 每次构建(制作)lib,仅当 lib 较新时才重新编译项目

c++ - 在编写 Windows 桌面应用程序时,我应该在哪里跟踪我的窗口句柄?

c++ - 获取满足某些条件的已排序 std::vector 中的范围

java - lambda 不需要异常处理

c++ - 通过值捕获使用 lambda 表达式