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有何不同?@Girval
的类型将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;
}