이미 많은 훌륭한 답변이 있음을 알았습니다. 그중 일부는 반복 될 것이지만 때로는 자신의 말로 물건을 넣고 싶어합니다. 나는 가장 친숙한 언어이기 때문에 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();
이 경우 코드를 두 곳에서 수정해야합니다. 원본 코드가 다음과 같은 형식 유추와 대조됩니다.
std::vector<int> v;
auto i = v.begin();
그리고 수정 된 코드 :
std::vector<double> v;
auto i = v.begin();
이제 한 줄의 코드 만 변경하면됩니다. 이것을 큰 프로그램으로 추정하면 형식 유추를 통해 편집기를 사용하는 것보다 훨씬 빠르게 변경 사항을 형식에 전파 할 수 있습니다.
코드 중복성으로 인해 버그가 발생할 수 있습니다. 코드가 동등하게 유지되는 두 가지 정보에 의존 할 때마다 실수의 가능성이 있습니다. 예를 들어,이 문장에서 두 유형 사이에 불일치가 있는데 이는 의도하지 않은 것입니다.
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 ++에서는 위의 예제가 형식 유추로 더 간단한 두 번째 이유가 있습니다. 유형 유추는 암시 적 유형 변환을 도입 할 수 없습니다. 의 반환 유형 sq(x)
이 아닌 int
경우 컴파일러는에 암시 적 변환을 자동으로 삽입합니다 int
. 의 반환 유형 이을 sq(x)
정의하는 유형 복합 유형 인 operator int()
경우이 숨겨진 함수 호출은 임의로 복잡 할 수 있습니다.