user2059893 user2059893 - 3 months ago 20
C++ Question

Why does std::result_of not work with lambdas?

I managed to reduce my case to the following simplest piece of code:

#include <type_traits>

auto call(const auto& f) -> typename std::result_of<decltype(f)()>::type
{
return f();
}

int main()
{
return call([] { return 0; });
}


Neither gcc-4.9.2 and gcc-5.0.0 compile!

Both think that "call" should be returning a lambda function!
The don't figure out that "call" returns an int.

Is this a bug in the compiler or is my c++ off?
Many thanks.

Answer

Your code's not valid C++ because function parameter types cannot be auto, this syntax has been proposed for Concepts Lite and may become part of the language in the future.

result_of needs a call expression from which it will deduce the return type.

Fixing both of these, your code becomes

template<typename F>
auto call(F const& f) -> typename std::result_of<decltype(f)()>::type
//                    or typename std::result_of<F()>::type
{
  return f();
}

Or you could just use

template<typename F>
auto call(F const& f) -> decltype(f())
{
  return f();
}

Live demo


I think your original code should compile if you fix the result_of expression, but it doesn't on gcc-4.9 or 5.0; maybe this is a bug with the gcc extension that allows parameter types to be auto

// This fails to compile
auto call3(const auto& f) -> typename std::result_of<decltype(f)()>::type
{
  return f();
}
Comments