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
씹어먹는 C++ - <16 - 3. 타입을 알려주는 키워드 decltype 와 친구 std::declval>
decltype 키워드를 통해서 우리가 원하는 식의 타입을 알 수 있습니다. 만일 해당 식이 단순한 식별자 표현식 (identifier expression) 이라면 그냥 그 식의 타입으로 치환됩니다. 그 이외의 경우라면 해
modoocode.com
반응형
'프로그래밍 > C,C++' 카테고리의 다른 글
[Modern C++20] 삼중 비교 연산자(Three-Way Comparison) (0) | 2025.03.28 |
---|---|
[Modern C++] 람다 표현식 (Lambda Expression) (0) | 2025.03.26 |
[Modern C++] STL 자료구조 (0) | 2025.03.24 |
[Modern C++] std::atomic (1) | 2025.03.21 |
[Modern C++] 동기화 기법(Synchronization) (0) | 2025.03.20 |