반응형
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);
}반응형
댓글