본문 바로가기
프로그래밍/Modern Effective C++

Item 3. Decltype

by drogrammer 2021. 8. 30.
반응형

C++11 버전에서 소개된 decltype 을 알아보자.

1. decltype

decltype 은 주어진 변수, 리터럴, 식의 타입을 알아내서 컴파일 전에 치환하는 키워드다. 

int i = 0;            // int
decltype(i) j = 1;    // int 로 치환
int& ir = i;          // int&
decltype(ir) jr = i;  // int& 로 치환

2. decltype(auto)

decltype(auto)는 c++ 14 버전에서 지원하는 문법으로 auto 의 불편한 점을 보완해 준다.

아래 처럼 auto를 사용 할 경우 필요에 따라 auto, auto&, auto&& 을 잘 선별해서 사용해야 한다. 

int& ir = i;        // int&
auto air = ir;      // int 로 추론 (레퍼런스 제거)
auto& arir = ir;    // int& 로 추론

(참고: https://drogrammer.tistory.com/61)

하지만, 대입되는 대상의 타입을 변경 없이 그대로 사용하고 싶은 경우라면, 아래와 같이 decltype(auto) 사용하여 간단하게 처리가 가능하다.

int i = 0;                 // int
decltype(auto) dai = i;    // int 로 추론
  
int& ir = i;               // int&
decltype(auto) dair = ir;  // int& 로 추론

 

3. decltype 치환 예외 

변수 이름 이외의 lvalue 표현은 모두 레퍼런스로 치환한다.

int i = 0;            // int
decltype(i) j = i;    // int 로 치환
decltype((i)) k = i;  // int& 로 치환

 

음.. 별로 중요해 보이지 않는다고 생각할 수 있지만, 아래와 같은 습관적으로 리턴값에 괄호를 사용할 경우 문제가 발생할 수 있다.

// 리턴 값이 int 로 추론
decltype(auto) f1() {
  int r = 0;
  return r;
}

// 리턴 값이 int& 로 추론
decltype(auto) f2() {
  int r = 0;
  return (r);
}
반응형

댓글