传递非自动非常量左值引用时,for_each,map和lambda出错

时间:2017-11-13 09:05:19

标签: c++ lambda foreach reference auto

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

  

不能绑定类型为'std :: pair&'的非const左值引用。到#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

2 个答案:

答案 0 :(得分:6)

您无法修改std::map的密钥,因此您应该使用

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

答案 1 :(得分:3)

试试这个:

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

Key对的元素声明为const至关重要。请参阅value_type documentation中的std::map成员类型。

在下一行[{1}}中有效,因为它会自动将auto声明为Key