On this page
article
C++ Type Deduction
auto 키워드
auto
는 우변의 초기값을 통해 변수의 타입을 자동으로 결정합니다.
auto a1 = 10; // int
const int c = 10;
auto a2 = c; // int (const 속성이 제거됨)
const auto a3 = c; // const int
타입 추론 종류
C++에서는 다양한 상황에서 타입 추론이 발생합니다:
auto
키워드- 템플릿 인자 추론
decltype
decltype(auto)
추론된 타입 확인 방법
1. typeid
사용
auto a1 = 10;
std::cout << typeid(a1).name() << std::endl; // 비정확할 수 있음
2. boost::type_index
사용
#include <boost/type_index.hpp>
auto a1 = 10;
std::cout << boost::typeindex::type_id_with_cvr<decltype(a1)>().pretty_name() << std::endl;
3. 의도적 에러 발생
template<typename T>
class TD; // 정의되지 않은 템플릿 클래스
auto a1 = 10;
TD<decltype(a1)> td; // 컴파일 에러 발생 - 에러 메시지에서 타입 확인
4. std::source_location
(C++20)
void log_function_name(std::source_location loc = std::source_location::current()) {
std::println("{}", loc.function_name());
}
이는 C의 __FILE__
, __LINE__
매크로를 대체할 수 있는 기능입니다.
RTTI (Run Time Type Information)
typeid
연산자는 RTTI 기술의 일부입니다.
// typeid(T).name()은 const, volatile, reference가 제거된 이름을 반환
템플릿과 auto의 타입 추론 규칙
auto
와 템플릿의 타입 추론은 거의 동일한 규칙을 따릅니다.
함수 템플릿 파라미터가 T인 경우 (auto와 동일)
template<typename T>
void func(T param);
func(expr); // expr의 타입으로 T 추론
이 경우:
- reference, const, volatile 속성이 제거되고 타입을 결정
- 다만 인자가 가진 속성만 제거됨
- 예:
const char* const ptr
을 전달하면const char*
로 추론됨
함수 템플릿 파라미터가 T&인 경우
template<typename T>
void func(T& param);
func(expr); // expr의 타입으로 T 추론
이 경우:
- reference만 제거하고 const, volatile 속성은 유지
- const 객체를 가리키려면 const reference가 필요하기 때문에 const 속성 유지
auto 반환 타입 추론
C++14부터 함수의 반환 타입으로 auto
를 사용할 수 있습니다.
auto func() {
return 42; // int로 추론
}
- return 문장을 보고 추론
- 두 개 이상의 return 문이 서로 다른 타입을 반환하면 컴파일 에러 발생
decay 개념
“decay"는 배열 또는 함수를 인자로 전달했을 때 포인터로 변환되는 현상을 말합니다.
template<typename T>
void f1(T a, T b) { }
template<typename T>
void f2(T& a, T& b) { }
int main() {
f1("apple", "banana"); // OK: T = const char*
f2("apple", "banana"); // 오류: T = const char[6], const char[7]
}
f1
에서는 배열이 포인터로 decay되어const char*
타입으로 추론됨f2
에서는 reference로 인해 decay가 발생하지 않아, 정확한 배열 타입으로 추론됨- 서로 다른 길이의 배열이기 때문에 타입이 일치하지 않아 오류 발생