4
auto lambda = [](){ return 7; };
std::result_of<decltype(lambda)()>::type val = lambda(); //  'val' : illegal use of type 'void'

我得到错误:'val' : illegal use of type 'void'。为什么该类型会解析为 void?

我可能弄错了什么result_of得到我。我只想要我可以传递的任何东西的返回值 a std::function

4

1 回答 1

5

如果您的编译器无法编译它,请不要使用std::result_of

decltype(lambda()) val = lambda();

这完全一样,它应该(嗯,可以)在 VC2010 中工作。

您也可以使用auto,尽管我认为这不是您想要的:

auto val = lambda();

编辑:由于您在函数的返回值中使用它,因此decltype上面显示的解决方案可以正常工作:

#include <type_traits>
#include <iomanip>
#include <iostream>

template<class Functor>
auto foo(const Functor &f) -> decltype(f()) {
    return f();
}

int main() {
    auto lambda = [](){ return 7; };
    auto val = foo(lambda);
    std::cout << std::boolalpha;
    std::cout << std::is_same<decltype(val), int>::value << std::endl;
}

演示在这里

于 2012-08-13T17:26:39.560 回答