일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 자바스크립트
- 퍼셉트론
- 자바
- 5585
- 소프트맥스 함수
- tcp
- Old-14
- 웹해킹
- 프로그래머스
- Old-17
- 코딩테스트 연습
- JS
- 신규 아이디 추천
- c언어 게임
- openCV
- 네트워크
- old-1
- 딥러닝
- 크레인 인형뽑기
- 계단함수
- 백준
- 10809
- c++
- 게임 프로그래밍
- 코드엔진
- 웹케이알
- C언어
- 리버싱
- boj
- webhacking.kr
- Today
- Total
SteffenLee
[C++]decltype 타입 지정자 본문
decltype 타입 지정자
decltype 타입 지정자는 C++11에 추가됐습니다.
이 지정자는 피연산자의 타입을 반환합니다. 그리고 컴파일러에서는 타입을 결정하기 위한 표현식일뿐 평가를 하지 않습니다.
구문은 decltype('expression'); 입니다.
예를 들자면 decltype(f()) sum = x;이면 f의 반환 타입에 따라서 sum의 타입이 정해집니다.
decltype에서 상위 const와 참조자를 다루는 방식은 auto 타입과 약간의 차이가 있습니다.
decltype를 적용하는 표현식이 변수이면 상위 const와 참조자를 포함해 대상 변수의 타입으로 반환합니다.
간단한 예시를 보자면
1 2 3 4 5 6 7 8 9 10 | #include<iostream> using namespace std; int main() { const int asdf = 10, &qwer = asdf; decltype(asdf) x = 0; //x는 const int 타입이 된다. decltype(qwer) pi = x; //pi는 const int& 타입, x와 결합 decltype(qwer) si; //오류 } | cs |
이런 식이 된다. decltype(qwer) si가 오류나는 이유는 qwer 타입이 const int& 이므로 초기화를 해줘야 한다.
그런데 초기화를 하지 않았으므로 오류가 나는 것이다.
decltype과 참조자
decltype을 보면 변수가 아닌 표현식을 적용하면 그 표현식에서 반환하는 타입을 갖는다.
또한 대입의 왼쪽 피연산자가 될 수 있는 객체를 반환하는 표현식에서는 참조자 타입을 반환합니다.
ex)
1 2 3 4 5 6 7 8 | #include<iostream> using namespace std; int main() { int i = 42, *p = &i, &r = i; decltype(r + 0) b; decltype(*p) c;//c는 int& decltype(p) d; //d는 int* } | cs |
r은 int& 타입이지만 r + 0 처럼 표현을 한다면 참조하는 대상의 타입을 얻을 수 있게된다.
그러므로 b의 타입은 int형이된다.
위 예시를 보면, decltype(*p)이런식으로 역참조를 하게 되면 포인터가 가르키는 대상인 int& 타입이 되고
decltype(p)를 하게 되면 p의 타입인 int*형이 타입이 된다.
여기서 decltype과 auto 사이의 차이점은 decltype에서 하는 추론이 대상 표현식의 형식에 의존합니다.
그리고 decltype을 괄호 없이 적용을 하면 해당 변수의 타입을 얻지만, 괄호로 묶으면 컴파일러에서 표현식으로
인식을 합니다.
예시)
1 2 3 4 5 6 7 8 | #include<iostream> using namespace std; int main() { int i = 42, *p = &i, &r = i; decltype((i)) m; //int& decltype(i) c; //int형 } | cs |
위 예시처럼 decltype((변수))로 표현하면 참조자 형태가 되고 decltype(변수)이면 대상 변수가 참조자일 때 참조자가 됩니다.
글을 봐주셔서 감사합니다.
잘못된 내용이 있으면 지적을 해주시면 감사하겠습니다.
'Progamming > C,C++' 카테고리의 다른 글
[C++]STL vector (0) | 2018.04.07 |
---|---|
[C/C++]동적할당 연결리스트 (0) | 2018.04.05 |
[C언어]게임 만들기 - 숫자야구.ver2(2인용) (1) | 2017.10.11 |
[C언어]게임 만들기 - 행맨[Hang Man](텍스트 기반) (5) | 2017.09.23 |
[C언어]게임 만들기 - 숫자야구 (1) | 2017.09.22 |