본문 바로가기

전체 글50

6. auto가 원치 않은 타입으로 추론될 때에는 명시적 탕비의 초기치를 사용하라. - "보이지 않는" 프록시 타입 때문에 auto가 초기화 표현식의 타입을 "잘못" 추론할 수 있다. 예를 들어 예를 들어 std::vector::operator[]의 반환 타입은 bool&이 아니라 어떤 프록시 클래스(proxy class) 타입이다(Effective STL의 항목 18을 보자). 이러한 프록시(Proxy) 설계 패턴은 소프트웨어 설계 패턴 중 만신전(萬神殿 - Pantheon)을 아주 오래전부터 차지하고 있는 패턴 중 하나이다. 프록시 클래스 중에는 클라이언트에게 명백히 드러나도록 설계된 것들이 있다. std::shared_ptr와 std::unique_ptr가 좋은 예이다. 반면, 그 외의 프록시 클래스들은 다소 은밀하게 작동하도록(보이지 않도록) 숨겨져 있다. 대체로, "보이지 않는.. 2020. 12. 19.
5. 명시적 선언 보다는 auto를 선호하라. - auto 변수는 반드시 초기화해야하며, 이식성이나 효율성 문제를 유발할 수 있는 타입 불일치가 발생하는 경우가 거의 없으며, 대체로 변수의 타입을 명시적으로 지정할때 보다 타자량도 더 적다. auto는 반드시 초기화 해주어야 한다. int x1; // 문맥에 따라서는 초기화되지 않을 수 있음 auto x2; // 오류! 초기치가 꼭 필요함 auto x3 = 0; // 양호함: x3의 값이 잘 정의됨 반복자의 역반복자의 역참조를 통해 초기화되는 지역 변수 하나를 간단하게 선언해보자. template void dwim(It b, It e) { for (; b != e; ++b) { typename std::iterator_traits::value_type currValue = *b; } } auto를 사.. 2020. 12. 19.
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.