在C ++ 11中,如果正文只包含一个return语句,lambda可以推导出它们的返回类型。一个proposal is the works来删除这个限制,显然它已经在GCC中工作了。
有没有理由不能将其扩展到所有auto
返回函数?
这个扩展已经提出了吗?
答案 0 :(得分:3)
是否有理由不能将其扩展到所有自动返回功能?
嗯,除非在那里定义了函数(不仅仅是声明),否则它是不可能的。你将失去转发声明这些功能的能力。
此外,函数不会返回auto
。函数定义前面的auto
是一个纯语法的东西,允许尾随返回类型。并且最后指定返回类型的唯一原因是它可以引用函数的参数(通常用于模板和decltype
工作)。函数仍会返回特定值。
答案 1 :(得分:1)
事实上有一个原因。
即,函数的名称在函数范围内,但不在 trailing-return-type 规范中。 Lambdas是免除的,因为它们没有名称,尽管我认为从lambda初始化的变量(通过推理键入)也在范围内,因此they already suffer this problem even with the standard syntax(workaround)。
使用范围内的函数名称,可以构造无限循环类型依赖项。 e.g。
auto fact(int n)
{
return (n > 0)? n*fact(n-1): 1;
}
在这种情况下,输入对于多种返回类型选择是一致的:int
,long long
,float
和double
,以及{{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;
}