본문 바로가기

PROGRAMMING/Effective Modern C++24

4. 추론된 타입을 파악하는 방법을 알아두라. - 컴파일러가 추론하는 타입을 IDE 편집기나 컴파일러 오류 메시지, Boost TypeIndex 라이브러리를 이용해서 파악할 수 있는 경우가 많다. IDE 편집기 IDE(통합 개발 환경)의 코드 편집기 중에는 프로그램 개체(변수, 매개변수, 함수 등) 위에 마우스 커서를 올리면 그 개채의 타입을 표시해 주는 것이 많다. 이런 일이 가능하려면 편집기의 코드가 어느 정도는 컴파일 가능한 상태이어야 한다. 컴파일러가 코드를 파싱해서 타입 추론을 수행할 수 있을 정도로 편집기의 코드가 완성되어 있지 않으면 편집기는 요청된 개채의 타입을 표시할 수 없다. 일반적으로 int 같은 간단한 타입의 경우에는 IDE가 알려준 정보가 쓸만하지만, 좀 더 복잡한 타입이 관여할 때에는 IDE가 표시한 정보가 그리 도움이 되지.. 2020. 12. 13.
3. decltype의 작동 방식을 숙지하라. - decltype은 항상 변수나 표현식의 타입을 아무 수정 없이 보고 한다. C++11에서 decltype은 함수의 반환 타입이 그 매개변수 타입들에 의존하는 함수 템플릿을 선언할 때 주로 사용한다. 예를들어 컨테이너 하나와 색인 하나를 받고, 우선 사용자를 인증한 후 operator[]를 통해서 컨테이너의 한 요소를 돌려주는 함수를 작성한다고 하자. 그러면 함수의 반환 타입은 반드시 그러한 operator[]의 반환 타입과 동일해야 한다. 컨테이너의 operator[]의 반환 타입이 컨테이너에 따라 다를 수 있다. decltype을 이용하면 그런 함수의 반환 타입을 쉽게 표현할 수 있다. template auto authAndAccess(Container& c, Index i) -> decltype(.. 2020. 12. 13.
2. auto의 타입 추론 규칙을 숙지하라. - auto 타입 추론은 대체로 템플릿과 같지만, auto 타입 추론은 중괄호 초기자가 std::initializer_list를 나타낸다고 가정하는 반면 템플릿 타입 추론은 그렇지 않다는 차이점이 존재한다. auto를 이용해서 변수를 선언할 때 auto는 템플릿의 T와 동일한 역할을 하며, 변수의 타입 지정자(type specifier)는 ParamType과 동일한 역할을 한다. auto x = 27; // 타입 지정자는 그냥 auto const auto cx = x; // 타입 지정자는 const auto이다. const auto& rx = x; // 타입 지정자가 const auto&이다. 이 예들에서 x와 cx, rx의 타입들을 추론할 때, 컴파일러는 마치 선언마다 템플릿 함수 하나와 해당 초기화 .. 2020. 12. 13.
1. 템플릿 타입 추론 규칙을 숙지하라 - 템플릿 타입 추론 도중 참조 타입의 인수들은 비참조로 취급된다. 즉, 참조성은 무시된다. 함수 템플릿의 선언은 대체로 이렇게 선언하고 사용된다. template void test(ParamType param); test(expr); 컴파일 도중 x를 이용해 두 가지 타입을 추론하는데, 하나는 T에 대한 타입 추론이고 또 하나는 ParamType에 대한 타입 추론이다. 이 두 타입이 다른 경우가 많은데, 이는 ParamType에 흔히 const나 참조 한정자(&, &&) 같은 수식어들이 붙기 때문이다. 예를 들어 다음과 같이 호출한다고 치자. template void test(const T& param); 그리고 다음과 같이 호출해보자. template void test(const T& param); .. 2020. 12. 13.