aut*_*hir 10 c++ language-design return-type function-signature c++11
新的C++ 11标准添加了一个带有尾随返回类型的新函数声明语法:
// Usual declaration
int foo();
// New declaration
auto foo() -> int;
Run Code Online (Sandbox Code Playgroud)
此语法的优点是可以推导返回类型,如下所示:
template<class T, class U>
auto bar(T t, U u) -> decltype(t + u);
Run Code Online (Sandbox Code Playgroud)
但是为什么返回类型首先放在函数名之前?我想,一个答案是在那个时候不需要这种类型的演绎.如果是这样,假设一种新的编程语言是否有理由不使用尾随返回类型?
一如既往,K&R是这里的"坏人".他们设计了C语言的函数语法,C++基本上按原样继承了它.
在这里疯狂猜测:在C中,声明应该暗示用法,即如何从某些东西中获取价值.这反映在:
int i;,int通过写入访问iint *p;,int通过写入访问*pint a[n];,int由写入访问a[n]int f();,int通过写入访问f()因此,整个选择取决于"简单价值"案例.正如@JerryCoffin已经指出的那样,我们得到的原因type name,而不是name : type可能是埋在编程语言的古老的历史.我想K&R认为type name更容易将重点放在使用上,仍然有指针等类型.
如果他们选择了name : type,他们就会从声明中脱离使用:p : int*或者说指针不再是类型,而是像名字的装饰:*p : int.
在个人笔记中:想象一下,如果他们选择后者并且C++继承了它 - 它根本就没有用,因为C++强调的是类型而不是用法.这也是为什么int* p被称为"C++方式"并int *p成为"C方式"的原因.
如果是这样,假设一种新的编程语言是否有理由不使用尾随返回类型?
是否有理由不默认使用扣除?;)参见,例如Python或Haskell(或任何函数语言,IIRC) - 没有明确指定返回类型.还有一个向C++添加此功能的动作,所以在未来的某个时候你可能会看到auto f(auto x){ return x + 42; }甚至是[]f(x){ return x + 42; }.
C++基于C,它基于B,它基于基于CPL的BCPL.
我怀疑,如果你要追踪整个历史,你可能最终会使用Fortran,它使用了类似的声明integer x(例如Pascal,它使用了类似的声明:) var x : integer;.
同样地,对于一个函数,Pascal使用了类似function f(<args>) : integer;的东西.在这种情况下,可能是安全的猜测(至少在这个特定的方面)Pascal的语法可能会更适合类型推导.