退货类型扣除

时间:2012-02-04 06:35:39

标签: c++ c++11

  

可能重复:
  Omit return type in C++11

在C ++ 11中,如果正文只包含一个return语句,lambda可以推导出它们的返回类型。一个proposal is the works来删除这个限制,显然它已经在GCC中工作了。

有没有理由不能将其扩展到所有auto返回函数? 这个扩展已经提出了吗?

2 个答案:

答案 0 :(得分:3)

  

是否有理由不能将其扩展到所有自动返回功能?

嗯,除非在那里定义了函数(不仅仅是声明),否则它是不可能的。你将失去转发声明这些功能的能力。

此外,函数不会返回auto。函数定义前面的auto是一个纯语法的东西,允许尾随返回类型。并且最后指定返回类型的唯一原因是它可以引用函数的参数(通常用于模板和decltype工作)。函数仍会返回特定值。

答案 1 :(得分:1)

事实上有一个原因。

即,函数的名称在函数范围内,但不在 trailing-return-type 规范中。 Lambdas是免除的,因为它们没有名称,尽管我认为从lambda初始化的变量(通过推理键入)也在范围内,因此they already suffer this problem even with the standard syntaxworkaround)。

使用范围内的函数名称,可以构造无限循环类型依赖项。 e.g。

auto fact(int n)
{
    return (n > 0)? n*fact(n-1): 1;
}

在这种情况下,输入对于多种返回类型选择是一致的:intlong longfloatdouble,以及{{1}等等。

trailing-return-type 没问题,代码完全是非法的:

std::complex<double>

在另一个例子中,任何选择返回类型都不一致:

auto fact(int n) -> decltype((n > 0)? n*fact(n-1): 1) /* unknown identifier fact */

你的新改进的g ++对此做了什么?

auto f(int a)
{
    char r[sizeof(f(a))+1];
    return r;
}