为什么在函数名之前返回类型?

时间:2012-10-03 02:51:55

标签: c++ c++11 language-design return-type function-signature

新的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);

但是为什么返回类型首先放在函数名之前?我想一个答案就是在那个时候不需要这种类型的推论。如果是这样,假设新的编程语言是否有理由不使用尾随返回类型?

2 个答案:

答案 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>