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가 발생하지 않아, 정확한 배열 타입으로 추론됨
  • 서로 다른 길이의 배열이기 때문에 타입이 일치하지 않아 오류 발생