13

新しい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);

では、そもそもなぜ関数名の前に戻り型が置かれたのでしょうか。当時はそのような型の演繹は必要なかったというのが一つの答えだと思います。もしそうなら、架空の新しいプログラミング言語がデフォルトで末尾の戻り型を使用しない理由はありますか?

4

2 に答える 2

9

いつものように、ここでは 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、おそらくプログラミング言語の古代の歴史に埋もれています。type nameK&R は、使用法に重点を置き、ポインターなどを型にする方が簡単であると判断したと思います。

を選択していた場合name : type、宣言から使用法を分離するか、p : int*ポインターを型ではなく、代わりに名前の装飾のようなものにするかのいずれかでした: *p : int

個人的なメモ: 彼らが後者を選択し、C++ がそれを継承した場合を想像してみてください。C++ は使用法ではなくに重点を置いているため、単純に機能しなかったでしょう。が「C++流」「C流」と言われる所以でもあります。int* pint *p

もしそうなら、仮想の新しいプログラミング言語がデフォルトで末尾の戻り値の型を使用しない理由はありますか?

デフォルトで控除を使用しない理由はありますか? ;) たとえば、Python や Haskell (またはそのことについては関数型言語、IIRC) を参照してください - 明示的に指定された戻り値の型はありません。この機能を C++ に追加する動きもありますので、将来的には単にauto f(auto x){ return x + 42; }または[]f(x){ return x + 42; }.

于 2012-10-03T03:30:18.550 に答える
7

C ++は、CPLに基づくBCPLに基づくBに基づくCに基づいています。

履歴全体を追跡すると、おそらく次のような宣言を使用したFortranにたどり着くと思いますinteger x(たとえば、次のような宣言を使用したPascalとは対照的ですvar x : integer;)。

同様に、関数の場合、Pascalは次のようなものを使用しましfunction f(<args>) : integer;た。状況下では、(少なくともこの特定の点で)Pascalの構文は、型の推定に少し適していると推測するのがおそらく安全です。

于 2012-10-03T03:01:13.613 に答える