[C++] decltype에 대해

조재훈·2024년 2월 12일

decltype

이번에는 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)에 따라 달라진다

값의 종류(Value Category)

이 부분은 모두의코드 부분을 참고했으며 정리가 잘 되어있다!

decltype에 식별자 표현식이 아닌 식이 전달된다면, 식의 타입이 T라고 할 때 아래와 같은 방식으로 타입을 리턴한다고 하자

  • 만일 식의 값의 종류가 xvalue라면 decltype는 T&&가 된다
  • 값의 종류가 lvalue라면 decltype는 T&가 된다
  • 값의 종류가 prvalue라면 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의 쓰임새

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은 배열 타입 그대로 전달할 수 있다

정리

위에서 언급한 모두의 코드 블로그에서 정말 자세히 이해하기 쉽게 설명해놓았으니까 그거를 읽는 것이 더 좋을 것 같다 ㅎㅎ;;

profile
나태지옥

0개의 댓글