프로그래밍/C,C++

[Modern C++] decltype

GONII 2025. 3. 25. 10:43

decltype 개념 및 사용법

decltype은 표현식(expression)의 타입을 추론하는 C++ 키워드입니다.
컴파일 타임에 특정 변수나 표현식의 정확한 타입을 가져올 때 사용됩니다.


1. 기본 사용법

#include <iostream>

int main() {
    int x = 10;
    decltype(x) y = 20;  // y의 타입은 int (x의 타입을 따름)
    
    std::cout << y << std::endl;  // 출력: 20
}
  • decltype(x)는 x의 타입을 가져오므로, y의 타입은 int가 됩니다.

2. decltype과 auto 차이점

auto

  • 컴파일러가 타입을 유추하지만, 값을 기반으로 타입을 결정합니다.
  • 우변을 기반으로 타입이 결정됨 (대입되는 표현식의 타입)
auto a = 10;   // a는 int (10은 int 리터럴)
auto b = 10.5; // b는 double (10.5는 double 리터럴)

decltype

  • 표현식 자체의 타입을 가져옴
  • 변수의 타입을 정확하게 가져옴, 변수의 const나 & 여부도 유지됨
int x = 10;
decltype(x) y;  // y의 타입은 int (x의 타입을 그대로 유지)

3. decltype과 참조(&)

  • decltype은 변수가 참조 타입이면 그대로 유지합니다.
int a = 10;
int& ref = a;  // ref는 a를 참조

decltype(ref) b = a;  // b는 int& (참조 유지)
b = 20;  // a도 20으로 변경됨

std::cout << a << std::endl;  // 출력: 20
  • decltype(ref)는 int&이므로, b는 int& 타입이 됩니다.
  • 따라서 b를 변경하면 a도 변경됩니다.

4. decltype과 const

  • const도 유지됩니다.
const int x = 10;
decltype(x) y = 20;  // y의 타입은 const int

// y = 30;  // 컴파일 에러 (const 변수는 변경 불가)

5. decltype((expression)) (이중 괄호)

  • decltype((변수)) 형태를 사용하면 참조 타입이 됩니다.
int x = 10;
decltype((x)) y = x;  // y의 타입은 int&
y = 20;  // x도 20으로 변경됨

std::cout << x << std::endl;  // 출력: 20
  • (x)처럼 괄호로 감싸면 참조(int&)로 추론됩니다.
  • decltype(x) → int
  • decltype((x)) → int& (참조 유지)

6. 함수 리턴 타입 추론 (decltype(auto))

C++14부터 decltype(auto)를 사용하여 함수의 반환 타입을 자동 추론할 수 있습니다.

int x = 10;
int& getRef() { return x; }

decltype(auto) foo() { return getRef(); }

int main() {
    decltype(auto) y = foo();  // y의 타입은 int&
    y = 20;  // x도 20으로 변경됨

    std::cout << x << std::endl;  // 출력: 20
}
  • decltype(auto)를 사용하면 리턴 타입의 참조 여부까지 정확히 유지됩니다.

7. decltype을 활용한 템플릿 코드

  • decltype을 사용하면 템플릿에서 유연한 타입 추론이 가능합니다.
#include <iostream>

template <typename T1, typename T2>
auto add(T1 a, T2 b) -> decltype(a + b) {
    return a + b;
}

int main() {
    std::cout << add(10, 5.5) << std::endl;  // 15.5 (double)
}
  • decltype(a + b)를 사용하면 두 개의 타입을 더한 결과 타입을 반환할 수 있습니다.

요약

용도 설명
decltype(x) x의 타입을 가져옴
decltype((x)) x의 참조 타입을 유지
decltype(auto) auto와 decltype을 조합하여 리턴 타입 추론
함수 리턴 타입 decltype(auto) func() { return 값; }
템플릿 decltype(a + b)를 이용하여 동적 타입 반환

decltype은 타입 추론과 템플릿 활용에 유용한 기능으로, auto와 함께 사용하면 더 강력한 코드를 작성할 수 있습니다! 🚀


Reference

https://modoocode.com/294

 

씹어먹는 C++ - <16 - 3. 타입을 알려주는 키워드 decltype 와 친구 std::declval>

decltype 키워드를 통해서 우리가 원하는 식의 타입을 알 수 있습니다. 만일 해당 식이 단순한 식별자 표현식 (identifier expression) 이라면 그냥 그 식의 타입으로 치환됩니다. 그 이외의 경우라면 해

modoocode.com

 

반응형