Durante el trabajo me encontré con un problema con un bucle for_each.
Tengo un std::unordered_map dentro de una estructura que contiene otro objeto. Cuando uso std::for_each no puedo usar auto& para llamar al elemento actual, el compilador no puede deducir el tipo. Por otro lado, si evito auto& y uso std::unordered_map<std::size_t, Foo>::value_type& todo funciona como se esperaba.
Estoy bien con eso, pero no entiendo por qué el compilador no puede deducir el tipo aquí... puede encontrar este ejemplo a continuación aquí en el explorador del compilador: https://godbolt.org/z/3eehKsxs7
#include <iostream> #include <unordered_map> #include <algorithm> struct Foo { template<typename T> T do_some_work() { // do some work .. T t; return t; } }; struct map_manager { std::unordered_map<std::size_t, Foo> m_map; }; int main() { Foo f1; map_manager mm; mm.m_map[1] = f1; mm.m_map[2] = f1; mm.m_map[3] = f1; std::for_each(std::begin(mm.m_map), std::end(mm.m_map), //[](std::unordered_map<std::size_t, Foo>::value_type& current){ // works [](auto& current){ // doesn't work auto bar = current.second.do_some_work<int>(); }); }