すでに多くのすばらしい答えがあることがわかります。そのうちのいくつかは繰り返しますが、時々あなたは自分の言葉で物事を置きたいだけです。それは私が最も精通している言語なので、C ++のいくつかの例でコメントします。
必要なことは決して賢明ではありません。他の言語機能を実用的にするには、型推論が必要です。C ++では、発話できない型を持つことができます。
struct {
double x, y;
} p0 = { 0.0, 0.0 };
// there is no name for the type of p0
auto p1 = p0;
C ++ 11は、やはり発言できないラムダを追加しました。
auto sq = [](int x) {
return x * x;
};
// there is no name for the type of sq
型推論もテンプレートを支えています。
template <class x_t>
auto sq(x_t const& x)
{
return x * x;
}
// x_t is not known until it is inferred from an expression
sq(2); // x_t is int
sq(2.0); // x_t is double
しかし、あなたの質問は、「プログラマーが、コードを読むときに変数の型を推測したいのはなぜでしょうか。誰が型を読むだけで、どの型があるかを考えるよりも速くないのですか?」
型推論は冗長性を取り除きます。コードの読み取りに関しては、コードに冗長な情報を含める方が高速で簡単な場合がありますが、冗長な情報は有用な情報を覆い隠す可能性があります。例えば:
std::vector<int> v;
std::vector<int>::iterator i = v.begin();
C ++プログラマーがiがイテレーターであることを識別するのに標準ライブラリーにあまり慣れていないi = v.begin()
ため、明示的な型宣言の値は制限されます。その存在により、より重要な詳細(i
ベクトルの先頭を指すなど)があいまいになります。@amonによるすばらしい回答は、重要な詳細を覆い隠す冗長性のさらに良い例を提供します。対照的に、型推論を使用すると、重要な詳細がより顕著になります。
std::vector<int> v;
auto i = v.begin();
コードの読み取りは重要ですが、十分ではありませんが、ある時点で読み取りを停止し、新しいコードの書き込みを開始する必要があります。コードの冗長性により、コードの変更がより遅く、より難しくなります。たとえば、次のコードの断片があるとします。
std::vector<int> v;
std::vector<int>::iterator i = v.begin();
ベクトルの値型を変更してコードを二重に変更する必要がある場合:
std::vector<double> v;
std::vector<double>::iterator i = v.begin();
この場合、2つの場所でコードを変更する必要があります。元のコードが次の場合の型推論とは対照的です。
std::vector<int> v;
auto i = v.begin();
そして変更されたコード:
std::vector<double> v;
auto i = v.begin();
コードを1行変更するだけでよいことに注意してください。これを大規模なプログラムに外挿すると、型の推論は、エディターを使用した場合よりもはるかに迅速に変更を型に反映できます。
コードの冗長性により、バグが発生する可能性があります。コードが同等に保たれている2つの情報に依存しているときはいつでも、間違いの可能性があります。たとえば、このステートメントの2つのタイプの間に矛盾がありますが、これはおそらく意図されていません。
int pi = 3.14159;
冗長性は、意図を見分けるのを難しくします。型の推論は、明示的な型の指定よりも簡単であるため、読みやすく、理解しやすい場合があります。コードの断片を考えてみましょう:
int y = sq(x);
をsq(x)
返す場合、がの戻り型であるか、を使用するステートメントに適しているため、であるint
かy
は明らかではありません。が返されないように他のコードを変更すると、その行だけではタイプの更新が必要かどうかがわかりません。同じコードですが、型推論を使用しているのと対照的です:int
sq(x)
y
sq(x)
int
y
auto y = sq(x);
この場合、意図は明確でy
あり、によって返されるのと同じ型でなければなりませんsq(x)
。コードがの戻りsq(x)
タイプをy
変更すると、変更のタイプは自動的に一致します。
C ++では、上記の例が型推論を使用してより単純になる2番目の理由があります。型推論は暗黙的な型変換を導入できません。の戻り値の型がsq(x)
でないint
場合、コンパイラは暗黙的に暗黙の変換をに挿入しint
ます。の戻り型がsq(x)
を定義する型複合型であるoperator int()
場合、この非表示の関数呼び出しは任意に複雑になる可能性があります。