C++ 什么';这个使用结果有什么问题? autolambda=[](){return 7;}; std::result_of::type val=lambda();/'val”:非法使用类型“void”

C++ 什么';这个使用结果有什么问题? autolambda=[](){return 7;}; std::result_of::type val=lambda();/'val”:非法使用类型“void”,c++,c++11,typetraits,C++,C++11,Typetraits,我得到了错误:“val”:非法使用类型“void”。为什么类型解析为void 我可能误解了的结果给了我什么。我只想从任何我可以传递的std::function返回值。如果编译器未能编译该函数,则不要使用std::result\u of: auto lambda = [](){ return 7; }; std::result_of<decltype(lambda)()>::type val = lambda(); // 'val' : illegal use of type 'vo

我得到了错误:
“val”:非法使用类型“void”
。为什么类型解析为void


我可能误解了的结果给了我什么。我只想从任何我可以传递的
std::function

返回值。如果编译器未能编译该函数,则不要使用
std::result\u of

auto lambda = [](){ return 7; };
std::result_of<decltype(lambda)()>::type val = lambda(); //  'val' : illegal use of type 'void'
这是完全相同的,它应该(很好,可以)在VC2010中工作

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

decltype(lambda()) val = lambda();
Edit:由于您在函数的返回值中使用了此选项,因此上面显示的
decltype
解决方案工作正常:

auto val = lambda();
#包括
#包括
#包括
模板
自动foo(常量函子&f)->decltype(f()){
返回f();
}
int main(){
自动lambda=[](){return 7;};
自动值=foo(λ);

std::cout更新您的编译器:GCC4.7.0对我来说没有错误…您不能使用
auto val=lambda()有什么原因吗
?从外观上看,可能是您的编译器尚未完全支持该功能。这只是一个小示例,说明了我的问题。实际上,我使用它作为返回值和模板参数,而不是
lambda
auto和long way有何不同?@Gir
val
的类型将be相同,因此没有实际差异。但可能OP出于某种原因试图避免
auto
(可能他会将该类型用作函数的模板参数)。@Gir使用
auto
会获取结果的副本。使用
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;
}