代码之家  ›  专栏  ›  技术社区  ›  David

这个使用结果有什么问题?

  •  4
  • David  · 技术社区  · 12 年前
    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 得到我。我只想要任何我能传递的返回值 std::function

    1 回复  |  直到 12 年前
        1
  •  5
  •   mfontanini    12 年前

    如果你的编译器无法编译,那么不要使用 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;
    }
    

    演示 here