auto / decltype

보물창고·2022년 8월 9일
0

c++ basic 코드누리

목록 보기
5/50
  • 코드누리 강의를 보고, 복습 및 공부내용을 정리 한 내용임.

1. 개념

: 변수의 타입을 컴파일러가 결정하는 문법.
-> 컴파일 시간에 결정되므로, 오버헤드 없음.

2. auto와 decltype

가. auto

: 우변의 수식으로, 변수의 타입이 결정됨.

  • 특징 : 반드시 초기값이 필요함.

사용법
auto n = 1; // n은 int 형임.
auto n = 4.8f; // n은 float형임

나. decltype

: 괄호 () 안에 들어오는 변수나 값를 보고 , 타입이 결정됨.

  • 특징 : 초기값이 없어도 됨.

사용법.
int n = 0;
decltype(n) n2; // => n2는 int 타입임.

다.problem

: 선언하고, type을 출력하라.

😊3.배열에서의 auto와 decltype

가.auto

: 배열의 시작값을 auto로 받게 될 경우에 대해서 생각을 해보자.

지금까지 공부를 하면서 배열형태로 , 미리 선언된 배열을
받으면 오류가 발생했음.
int arr[] {1,2,3};
int arr2[] = arr; // X => 불가함!
int *p = arr; // O => 가능함!!
=>: 포인터를 이용해 배열을 참조할 수 있음!

  • 실제로는 c++ / c에서의 형식 연역의 일부임.
    모던 이펙티브 섹션 2에 설명함.

왜 이럴까에 대한 나의 고찰 : 배열 arr은 지역변수메모리이고, arr2도 지역변수 메모리이다. 만약에 블록 벗어나 삭제 할 경우, 하나의 메모리를 2번 지우게 되기 때문에 배열은 배열로 받을수 없게 설계하지 않았을까? 생각해좀.

  • 결론
    - 일단 배열은 암묵적으로 포인터로 치환을 하기 때문에 value 타입으로 받게 되면 포인터타입으로 결정되고, 참조 타입으로 받으면 int[size] 타입으로 결정된다.

auto 에다가 배열 넣어보면, 포인터 형이 나옴.

~~이를 통해서 auto의 경우는 포인터 형식으로 정해짐. ~~
// 아니고,
즉 배열의 경우, 컴파일러가 암묵적으로 포인터 타입으로 받아들인다는 것을 확인할 수 있다.
auto & = arr[];
-> 이 경우에는 배열로 받는 것을 확인할 수 있다.
즉 배열의 실제 타입이 있다는 것이다.

- 결론 : auto는 배열을 받을 경우, 포인터 형식으로 변경됨.

나. decltype

: 배열을 받을 경우, decltype은 문제가 없음.

  • 왜??? (확실하지는 않지만, 나의 생각임. )
    : 배열 = 배열 (간의 대입) 을 먼저 생각해야 함.
    뒤에서 배우겠지만, 이렇게 될 경우에는 , 얕은 복사가 이루어짐.
    배열은 실제로는 포인터 타입임.
    대입을 하게 될 경우, 배열의 원소들 뿐만이 아니라,
    포인터의 주소값도 공유를 하게 되므로,
    메모리 삭제 시, 이미 해제된 메모리를 다시 해제하려고 하므로,
    문제임.
    일반적인 배열은 유저타입이 아니기 때문에, c++ 에서
    이를 그냥 배제하고 있는 것임.
  • but, decltype의 경우, auto와는 다름.
    : 대입이 아닌, 괄호를 통해 형식을 확인하는 것이라고 생각됨...
    배열의 주소와 decltype의 주소를 확인하면 다름.
  • 결론 : decltype은 배열 형식 그대로 , 타입이 결정됨.
  • 예시
    int x[3] = {1,2,3};
    decltype(x) d2 => d2는 int[3] 으로 추론함.

다.problem

: 위의 내용을 토대로 코드를 만들어보고, 타입을 출력하라.

4.함수와 decltype

가. 개념

: 함수명을 decltype에 인자로 넣으면,
함수의 시그니처를 타입으로 결정됨.

나. 알아야 할점.

1) 함수의 명으로 받을 경우, -> 함수 시그니처 타입으로 변경함.
2) &함수 로 받을 경우 -> 함수 포인터 타입으로 변경함.
3) 함수 Call로 받을 경우 -> 함수의 반환 타입으로 변경함.
-> 아래 problem에 예시가 있음.

이해가 안 가면 그냥 외워..

auto로 배열 받으면, 포인터 형식으로 결정됨.
decltype으로 배열을 받으면, 배열 형식으로 결정됨.

다. problem

: 위의 설명을 읽어보고, 알아야 할점. 3개에 대한 코드를 만들고,
타입을 출력하라.

5. 배열의 원소를 받을 경우.

  • auto 와 decltype의 경우 타입이 또 다르게 변경된다고 함.
    decltype은 참조 타입으로 변경된다고 하는데,
    중급 과정에서 자세한 공부가 필요함.
profile
🔥🔥🔥

0개의 댓글