lambda的返回types可以通过返回值推导出来,所以为什么不能使用函数呢?

#include <iostream> int main(){ auto lambda = [] { return 7; }; std::cout << lambda() << '\n'; } 

这个程序编译和打印7。
lambda的返回types根据返回值7推导为整数types。


为什么普通函数不可能呢?

 #include <iostream> auto function(){ return 42; } int main(){ std::cout << function() << '\n'; } 

错误:“函数”函数使用“自动”types说明符没有尾随返回types

C ++ 14有这个function 。 你可以通过设置-std=c++1y标志来testing新版本的GCC或者clang。

现场示例

除此之外,在C ++ 14中,您还可以使用decltype(auto) (将decltype(auto)作为variables的decltype(auto) )来为您的函数使用decltype语义推导其返回值。

一个例子就是转发函数, decltype(auto)特别有用:

 template<typename function_type, typename... arg_types> decltype(auto) do_nothing_but_forward(function_type func, arg_types&&... args) { return func(std::forward<arg_types>(args)...); } 

通过使用decltype(auto) ,可以用指定的参数调用func的实际返回types。 在后面的返回types中没有更多的代码重复,这在C ++ 11中是非常令人沮丧和容易出错的。

这只是语言如何被创造和发展的限制。 在即将到来的C ++ 14标准中,函数的返回types可以在一些上下文中推导出来,尽pipe不是全部。 有多个返回语句时会有复杂性。

此外,推导的返回types还有其他的问题,例如,模板函数的返回types不能在SFINAE上下文中使用,为了能够推导出types,编译器必须实例化函数模板,这replace之后发生。 最终的结果是,虽然function将在不久的将来,我会避免它,如果你可以提供自己的types。

这是在C + + 14。 请参阅以下build议 。

它还没有..它将在C ++ 1y / C ++ 14 ..检查此function的链接

我的猜测是,这可能是因为types推断的lambdas不能recursion

为什么这很重要? 因为如果types推断的lambda可以是recursion的(通过“type-in​​ferred”我的意思是variables的名称是autotypes的),那么它的返回types可能依赖于它自己 – 虽然这有时可以解决,比“简单”式的推断要困难得多。 我甚至不确定它是否总是可以解决的(在一般情况下是否可以确定?)。 如果函数支持types推断,那么这个问题就不得不被处理了,所以他们可能会因为这个原因而被排除在外。