Это может быть ошибка GCC, так как она компилируется, если вы «используете» общую лямбду перед сборкой std::mem_fun
.Под «использованием» я подразумеваю, например, вызов лямбды или сохранение указателя mem-fun отдельно:
#include <functional>
auto generic_lambda = [](auto x) {
auto two = static_cast<decltype(x)>(2.l);
return two * x;
};
int main()
{
// call the lambda ...
generic_lambda(1.0);
// or retrieve the mem-fun ptr
auto unused = &decltype(generic_lambda)::template operator()<double>;
// now it compiles on GCC
auto generic_mem_fn = std::mem_fn(
& decltype(generic_lambda)::template operator()<double> );
}
см. живой пример
, чтобы вы могли использовать следующий подходчтобы сделать его совместимым с GCC:
auto ptr = &decltype(generic_lambda)::template operator()<double>;
auto generic_mem_fn = std::mem_fn(ptr);