2012-10-03 37 views
9

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

但是然后为什么返回类型放在函数名称之前?我想一个答案就是在那个时候没有必要进行这种类型的演绎。如果是这样,是否有理由让默认的新编程语言不使用尾随返回类型?

+6

C++真的没有像C++了... =( – paddy

+1

@paddy:这几乎是Ç+++现在 – Mehrdad

+2

@Mehrdad:右​​键如果旋转第二'1','C+++'就是你得到的 –

回答

6

一如既往,K & 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 & R花了type name,因为它更容易把重点放在使用上,并且仍然有指针等类型。

如果他们选择name : type,他们已经从申报或者不邻接用法:p : int*或将所做的指针不是类型了,而是会像装饰的名称:*p : int

就我个人而言:试想一下,如果他们选择了后者和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++,所以在将来你可能会看到auto f(auto x){ return x + 42; }甚至[]f(x){ return x + 42; }

+0

阅读这些要点的另一种方法:(1)如果我们仅仅使用它,那么'i'是一个'int'。 (2)'p'是一个'int' ...如果我们解引用它。 'a'是一个'int' ...如果我们为它编制索引。 'f'是一个'int' ...如果我们叫它。 – Mehrdad

5

C++基于C,基于B,基于BCPL,基于CPL。我怀疑如果你要追踪整个历史,你最终可能会在Fortran中使用声明,例如integer x(而不是像Pascal这样的声明,如var x : integer;)。同样,对于一个函数,Pascal使用了类似function f(<args>) : integer;的东西。在这种情况下,猜测(至少在这个特定的方面)可能是安全的,至少在这个特定的方面,Pascal的语法可能更适合类型推导。

+0

看到Brian Kernighan [写了关于他不喜欢帕斯卡尔](http://www.lysator.liu.se/c/bwk-on-pascal.html),似乎很清楚为什么Pascal的语法不被使用。 –

+0

@JesseGood:是的,没有 - 至少对我的记忆来说(似乎并不矛盾,只是对文章的一瞥),他并没有提及'int x;'与'x:int'是什么他不喜欢帕斯卡。同时,鉴于多少Pascal似乎总体上不受欢迎,你可能是正确的,几乎所有的东西都可能不受欢迎。 –

+2

@JerryCoffin希望情况如此,C++ 11标准对他离开这个属世的境界不负任何责任。 – paddy

相关问题