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