클래스 템플릿 인자 추론 (Class Template Argument Deduction)¶
명시적으로 지원하도록 선택한 템플릿에만 클래스 템플릿 인수 추론을 사용하세요.
클래스 템플릿 인수 공제(종종 "CTAD"로 축약됨)는 템플릿 이름을 지정하는 유형으로 변수가 선언되고 템플릿 인수 목록이 제공되지 않은 경우(빈 꺾쇠 괄호도 포함되지 않음) 발생합니다.
컴파일러는 명시적이거나 암시적일 수 있는 템플릿의 "추론 가이드"를 사용하여 초기화 프로그램에서 인수를 추론합니다.
명시적 추론 가이드는 선행하는 auto 가 없고 함수 이름이 템플릿의 이름이라는 점을 제외하면 후행 반환 유형이 있는 함수 선언과 유사합니다. 예를 들어 위의 예는 std::array에 대한 추론 가이드를 사용합니다.
(템플릿 특수화와 반대되는) 기본 템플릿의 생성자는 추론 가이드도 암시적으로 정의합니다.
CTAD에 의존하는 변수를 선언하면 컴파일러는 생성자 오버로드 해결 규칙을 사용하여 추론 가이드를 선택하고 해당 가이드의 반환 유형이 변수의 유형이 됩니다.
CTAD를 사용하면 코드에서 상용구를 생략할 수 있는 경우가 있습니다.
생성자에서 생성된 암시적 추론 가이드는 바람직하지 않은 동작을 가지고 있거나 완전히 부정확할 수 있습니다. 이는 CTAD가 C++17에 도입되기 전에 작성된 생성자의 경우 특히 문제가 됩니다. 왜냐하면 해당 생성자의 작성자는 생성자가 CTAD에 발생할 수 있는 문제를 알 수 있는 방법이 없었기 때문입니다(수정은 말할 것도 없고). 또한 이러한 문제를 해결하기 위해 명시적 추론 가이드를 추가하면 암시적 추론 가이드에 의존하는 기존 코드가 손상될 수 있습니다.
CTAD는 또한 auto와 동일한 많은 단점을 안고 있습니다. 두 메커니즘 모두 초기화 프로그램에서 변수 유형의 전체 또는 일부를 추론하기 위한 메커니즘이기 때문입니다. CTAD는 독자에게 auto보다 더 많은 정보를 제공하지만 정보가 생략되었다는 명확한 단서를 독자에게 제공하지도 않습니다.
템플릿 관리자가 하나 이상의 명시적인 추론 가이드를 제공하여 CTAD 사용 지원을 선택하지 않은 한 주어진 템플릿과 함께 CTAD를 사용하지 마세요(std 네임스페이스의 모든 템플릿도 선택한 것으로 추정됩니다). 가능한 경우 컴파일러 경고를 통해 이를 시행해야 합니다.
CTAD의 사용은 유형 추론에 대한 일반 규칙을 따라야 합니다.
이해하기 쉽게 설명하기¶
핵심: 명시적으로 지원하는 템플릿에만 CTAD¶
CTAD(클래스 템플릿 인자 추론)는 템플릿 인자 목록 없이 변수를 선언할 때 컴파일러가 인자를 추론하는 기능입니다.
규칙¶
- 템플릿 작성자가 명시적 추론 가이드(deduction guide)를 제공해 CTAD를 지원하기로 한 템플릿에만 쓰세요. (
std네임스페이스의 템플릿은 지원하는 것으로 간주.) - 생성자에서 자동 생성된 암시적 추론 가이드는 부정확하거나 바람직하지 않을 수 있습니다(특히 C++17 이전에 작성된 생성자).
- CTAD는
auto의 단점도 그대로 가집니다 — 정보가 생략됐다는 단서를 독자에게 주지 않습니다. - 사용은 타입 추론의 일반 규칙을 따르세요.