이번에는 C++의 decltype를 알아보자
지금까지 C++를 쓰면서 decltype이라는 것을 처음 들어봤는데 Effective Modern C++ 책에서 타입 추론 부분에서 볼 수 있었다.
본격적으로 decltype에 대해 알아보자
decltype은 C++11에서 도입된 형식 지정자이며, 인수로 지정한 식의 타입으로 치환된다.
auto 키워드와 함께 템플릿 라이브러리를 작성하는 개발자에게 유용하게 사용된다.
decltype(/* 타입을 알고자 하는 식 */)
위와 같이 사용하며 예제를 보자.
int a = 3;
decltype(a) a1 = 5; // int a1
int& r_a = a;
decltype(r_a) r_a1 = a1; // int& r_a1
int&& rr_a = 3;
decltype(rr_a) rr_a1 = 7; // int&& rr_a1
컴파일 시 int, int&, int&&로 치환된다. 위와 같이 decltype에 전달된 식이 괄호로 둘러쌓이지 않은 식별자 표현식이라면 해당 식의 타입을 얻을 수 있다.
만약 decltype에 식별자 표현식이 아닌 식을 전달하면, 해당 식의 값의 종류(value category)에 따라 달라진다
이 부분은 모두의코드 부분을 참고했으며 정리가 잘 되어있다!
decltype에 식별자 표현식이 아닌 식이 전달된다면, 식의 타입이 T라고 할 때 아래와 같은 방식으로 타입을 리턴한다고 하자
int a, b;
decltype(a + b) c;
c의 타입은 무엇이 될까? a + b는 prvalue이므로 a + b 식의 실제 타입인 int로 추론된다
int a;
decltype ((a)) b;
(a)는 식별자 표현식이 아니기 때문에 어느 값 카테고리에 들어가는지 부터 생각
&(a)와 같이 주소값을 얻을 수 있고 당연히 이동 불가능이라 lvalue이다. 따라서 int&로 추론된다.
decltype은 왜 필요할까? 타입 추론이 필요한 부분에는 auto로 충분하지 않나?
auto는 엄밀히 말하자면 정확한 타입을 표현하지 않는다.
const int i = 4;
auto j = i; // int j = i;
decltype(i) k = i; // const int k = i;
예에서 보듯이 auto는 const를 포함하지 않지만, decltype은 포함시킨다.
그 외에도 배열의 경우 auto는 암시적으로 포인터로 변환하지만, decltype은 배열 타입 그대로 전달할 수 있다
위에서 언급한 모두의 코드 블로그에서 정말 자세히 이해하기 쉽게 설명해놓았으니까 그거를 읽는 것이 더 좋을 것 같다 ㅎㅎ;;