: 변수의 타입을 컴파일러가 결정하는 문법.
-> 컴파일 시간에 결정되므로, 오버헤드 없음.
: 우변의 수식으로, 변수의 타입이 결정됨.
사용법
auto n = 1; // n은 int 형임.
auto n = 4.8f; // n은 float형임
: 괄호 () 안에 들어오는 변수나 값를 보고 , 타입이 결정됨.
사용법.
int n = 0;
decltype(n) n2; // => n2는 int 타입임.
: 선언하고, type을 출력하라.
: 배열의 시작값을 auto로 받게 될 경우에 대해서 생각을 해보자.
지금까지 공부를 하면서 배열형태로 , 미리 선언된 배열을
받으면 오류가 발생했음.
int arr[] {1,2,3};
int arr2[] = arr; // X => 불가함!
int *p = arr; // O => 가능함!!
=>: 포인터를 이용해 배열을 참조할 수 있음!
왜 이럴까에 대한 나의 고찰 : 배열 arr은 지역변수메모리이고, arr2도 지역변수 메모리이다. 만약에 블록 벗어나 삭제 할 경우, 하나의 메모리를 2번 지우게 되기 때문에 배열은 배열로 받을수 없게 설계하지 않았을까? 생각해좀.
auto 에다가 배열 넣어보면, 포인터 형이 나옴.
~~이를 통해서 auto의 경우는 포인터 형식으로 정해짐. ~~
// 아니고,
즉 배열의 경우, 컴파일러가 암묵적으로 포인터 타입으로 받아들인다는 것을 확인할 수 있다.
auto & = arr[];
-> 이 경우에는 배열로 받는 것을 확인할 수 있다.
즉 배열의 실제 타입이 있다는 것이다.
- 결론 : auto는 배열을 받을 경우, 포인터 형식으로 변경됨.
: 배열을 받을 경우, decltype은 문제가 없음.
- but, decltype의 경우, auto와는 다름.
: 대입이 아닌, 괄호를 통해 형식을 확인하는 것이라고 생각됨...
배열의 주소와 decltype의 주소를 확인하면 다름.
: 위의 내용을 토대로 코드를 만들어보고, 타입을 출력하라.
: 함수명을 decltype에 인자로 넣으면,
함수의 시그니처를 타입으로 결정됨.
1) 함수의 명으로 받을 경우, -> 함수 시그니처 타입으로 변경함.
2) &함수 로 받을 경우 -> 함수 포인터 타입으로 변경함.
3) 함수 Call로 받을 경우 -> 함수의 반환 타입으로 변경함.
-> 아래 problem에 예시가 있음.
auto로 배열 받으면, 포인터 형식으로 결정됨.
decltype으로 배열을 받으면, 배열 형식으로 결정됨.
: 위의 설명을 읽어보고, 알아야 할점. 3개에 대한 코드를 만들고,
타입을 출력하라.