Error with for_each, map and lambda when passing by non-auto non-const lvalue reference

风流意气都作罢 提交于 2019-12-10 18:53:06

问题


In the following code, the first for_each statement gives me errors with GCC 7.2, some of which says:

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;
}

What causes this error? How's that it works with auto, i.e., in the second for_each statement?

According to this answers: https://stackoverflow.com/a/14037863/580083 the first for_each should work (and I've also found another answer that said the very same).

Online code: https://wandbox.org/permlink/mOUS1NMjKooetnN1


回答1:


You can't modify key of a std::map, so you should use

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



回答2:


Try this:

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

It is crucial to declare Key element of pair as const. See the value_type member type in std::map documentation.

In your next line auto works, because it automatically declares Key as const.



来源:https://stackoverflow.com/questions/47260470/error-with-for-each-map-and-lambda-when-passing-by-non-auto-non-const-lvalue-re

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!