(참고: https://stackoverflow.com/q/1461432/4295499)
C, C++에서 배열과 포인터는 같다고 알고 계시는 분이 많을건데 뭐 거의 맞습니다만 정확하게는 약간 다릅니다
- 배열: 사이즈 정보 있음 (sizeof로 찍어보면 element 수를 알 수 있다)
- 포인터: 사이즈 정보 없음
여기서 배열->포인터 전환하면서 사이즈 정보를 버리는 건 가능합니다. 이걸 decay라고 합니다. 배열에서 포인터로 implicit conversion을 말합니다.
그럼, 포인터->배열은 될까요? 안됩니다. 사이즈 정보가 없기 때문입니다.
const int a[] = { 2, 3, 5, 7, 11 };
const int* p = a; // array to pointer decay
assert( sizeof(p) != sizeof(a) ); // sizes are not equal
C++11부터 std::decay가 추가됐습니다 (en.cppreference.com/w/cpp/types/decay)
Applies lvalue-to-rvalue, array-to-pointer, and function-to-pointer implicit conversions to the type
T, removes cv-qualifiers, and defines the resulting type as the member typedef type.
이걸로 타입의 decay 여부를 확인할 수도 있겠네요
반응형
'프로그래밍 > C++' 카테고리의 다른 글
[C++] 매크로 do {...} while (0) 용도 (0) | 2022.10.09 |
---|---|
[C++] 자바의 <T extends E>처럼 템플릿 타입 제한하는 방법 (0) | 2022.01.02 |
[C++17] std::any에 대해 (0) | 2020.10.03 |
Visual studio Google Test 사용 예제 (0) | 2020.08.09 |
C++ RAII (Resource Acquisition is initialization) (0) | 2020.07.26 |