2012-10-03 68 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

相關問題