新的C ++ 11标准添加了一个带有尾随返回类型的新函数声明语法:
// Usual declaration
int foo();
// New declaration
auto foo() -> int;
此语法的优点是可以推导出返回类型,如:
template<class T, class U>
auto bar(T t, U u) -> decltype(t + u);
但是为什么返回类型首先放在函数名之前?我想一个答案就是在那个时候不需要这种类型的推论。如果是这样,假设新的编程语言是否有理由不使用尾随返回类型?
答案 0 :(得分:6)
与往常一样,K&amp; R在这里是“坏人”。他们设计了C语言的函数语法,C ++基本上按原样继承了它。
狂野猜测: 在C中,声明应该暗示使用,即如何从某些东西中获取价值。这反映在:
int i;
,int
可通过撰写i
int *p;
,int
可通过撰写*p
int a[n];
,int
可通过撰写a[n]
int f();
,int
可通过撰写f()
因此,整个选择取决于“简单值”的情况。正如@JerryCoffin已经指出的那样,我们得到type name
而不是name : type
的原因可能隐藏在古代编程语言史中。我猜K&amp; R花了type name
,因为它更容易强调使用,仍然有指针等类型。
如果他们选择name : type
,他们就会从声明中解除使用:p : int*
或者指针不再是类型,而是类似于名称的装饰:{ {1}}。
个人记录:想象一下,如果他们选择后者并且C ++继承了它 - 它根本就没有用,因为C ++强调类型而不是用法。 This is also the reason why int* p
is said to be the "C++ way" and int *p
to be the "C way".
如果是这样,假设一种假设的新编程语言是否有理由不使用尾随返回类型?
默认情况下是否有理由不使用扣除? ;)参见,例如Python或Haskell(或任何函数语言,IIRC) - 没有明确指定返回类型。 There's also a movement to add this feature to C++,所以将来某个时候您可能会看到*p : int
甚至[]f(x){ return x + 42; }
。
答案 1 :(得分:5)
C ++基于C,它基于B,它基于基于CPL的BCPL。
我怀疑如果你要追溯整个历史,你可能最终会使用Fortran,它使用像integer x
这样的声明(而不是像Pascal那样使用声明,如:{{ 1}})。
同样,对于一个函数,Pascal使用类似var x : integer;
之类的东西。在这种情况下,猜测它是安全的(至少在这个特定的方面)Pascal的语法可能会更适合类型推导。< / p>