lambda的返回类型可以通过返回值推导出来,那么为什么函数不能?

时间:2013-12-04 05:13:56

标签: c++ function c++11 lambda auto

#include <iostream>

int main(){

    auto lambda = [] {
        return 7;
    };

    std::cout << lambda() << '\n';

}

该程序编译并打印7 lambda的返回类型基于返回值7推导为整数类型。


为什么普通功能不能实现这一点?

#include <iostream>

auto function(){
    return 42;
}

int main(){

    std::cout << function() << '\n';
}

错误:'function'函数使用'auto'类型说明符而没有尾随返回类型

5 个答案:

答案 0 :(得分:77)

C++14 has this feature。您可以通过设置-std=c++1y标志来使用新版本的GCC或clang进行测试。

Live example

除此之外,在C ++ 14中,您还可以使用decltype(auto)(将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的实际返回类型。在尾随返回类型中没有更多的代码重复,这在C ++ 11中非常令人沮丧且容易出错。

答案 1 :(得分:25)

这只是对语言创建和发展方式的限制。在即将到来的C ++ 14标准中,函数的返回类型可以在某些上下文中推导出来,尽管不是全部。当有多个return语句时会出现复杂情况。

此外,推导出的返回类型还有其他问题,例如,模板函数的返回类型不能在SFINAE上下文中使用,因为能够推断出类型,编译器必须实例化函数模板,在替换后发生。最终结果是,虽然该功能将在不久的将来出现,但如果您可以自己提供该类型,我会避免使用它。

答案 2 :(得分:10)

这将在c ++ 14中出现。请参阅以下proposal

答案 3 :(得分:6)

它还没有..它将在C ++ 1y / C ++ 14中..看看这个link of feature

答案 4 :(得分:5)

我的猜测是,这可能是因为类型推断的lambdas无法递归

为什么这很重要?因为如果类型推断的lambda可以是递归的(通过“类型推断”我的意思是变量的名称是auto类型的地方),那么它的返回类型可能可能依赖于它自己 - 虽然这有时是可能的要解决,它比“简单”类型推断更难实现。我甚至不确定它是否始终可解决(在一般情况下它是否可判定?)。但是,如果函数支持类型推断,则必须考虑这个问题,因此他们可能因为这个原因而将它们排除在外。