-
포인터의 타입 추론개발/C·C++ 2024. 8. 31. 12:31
template<typename T> void f(T* param) { cout << typeid(T).name() << endl; } int main() { int x = 30; const int* pcx = &x; f(pcx); }
f()
함수는T*
으로 인수를 받고 있다.const int*
로 선언된pcx
변수를 전달하면 어떤 타입으로 추론이 되는지 살펴본다. 답을 보기 전에 가능한 시나리오를 검토해보자.pcx
는const int*
이니까T
는const int
가 될 수도 있고 모종의 이유로const
가 탈락한int
가 될 수도 있다. 혹은T*
이므로 해당 타입이 가리키는 타입으로 추론될 수도 있을 것이다. 정답은 아래를 드래그 하면 된다.int
예상 가능한 시나리오의 세 번째에 해당한다고 볼 수 있다.
T*
은 해당 포인터 변수가 가리키는 타입을 추론한다.int
형 가리키기 때문에int
로 추론된다.그렇다면
f()
함수의 파라미터가T
이면 어떨까?#include <iostream> #include <typeinfo> using namespace std; template<typename T> void f(T param) { cout << typeid(T).name() << endl; } int main() { int x = 30; const int* pcx = &x; f(pcx); }
이 경우에
T
는const int*
로 추론된다. 해당 포인터 변수의 타입이 그대로 추론되는 것.하나 고민해 볼 재미있는 부분은 만약
pcx
를const int* const pcx = &x;
로 선언 및 정의를 하는 점이다. 포인터 변수 자체에const
를 적용하는 경우를 생각해보면, 사실 포인터 변수를 전달하는 건 값 복사와 똑같다. 원본에 상수성이 있는 것이지 복사본은 별개의 문제이기 때문에pcx
앞에 붙는const
는 사라진다.'개발 > C·C++' 카테고리의 다른 글
덧셈 연산 어셈블리 코드 간단 분석 (1) 2024.09.07 std::transform()에 대한 간단한 고찰 (2) 2024.09.04 [사소한 테스트] 곱셉/나머지 연산의 로직을 덧셈/뺄셈으로 변경한다면? (1) 2024.08.28 [윈도우 시스템 프로그래밍] 압축 파일 복사하기 (0) 2024.08.27 std::remove_if, std::erase (0) 2024.08.17