Skip to content

Item 5 요약 정리

ozt88 edited this page Mar 7, 2015 · 28 revisions

#Item 5 명시적 타입 선언보다 오토가 더 좋다.

일반 타입은 초기화 하지 않은 변수를 허용하므로 분명하게 정의되지 않는 경우가 있다.
반면 auto는 초기화 하지 않고서 사용할 수 없다.

   int x1;      //초기화 되지 않은 상태로 작동
   auto x2;     //컴파일 에러
   auto x3 = 0; //x3이 잘 정의된 상태로 작동

타입명이 지나치게 긴 경우 가독성을 해친다.
이 경우 auto를 사용하여 간결하게 표현할 수 있다.
C++14의 경우 람다의 매개 변수 타입에 auto를 사용할 수 있다.

   std::function<bool(const std::unique_ptr<Widget>&,
                      const std::unique_ptr<Widget>&)>
        derefUPLess = [](const std::unique_ptr<Widget>& p1,
                         const std::unique_ptr<Widget>& p2)
                       { return *p1 < *p2; };             //엄청나게 긴 선언
  
   auto derefUPLess = [](const std::unique_ptr<Widget>& p1,
                         const std::unique_ptr<Widget>& p2)
                       { return *p1 < *p2; };             //타입을 auto로 변경 간결한 선언
   
   auto derefUPLess = [](const auto& p1, const auto& p2)
                       { return *p1 < *p2; };           //C++14부터 람다 인자 auto를 활용한 훨씬 간결한 선언

+@ std::function?

일반화된 함수 포인터 템플릿.
함수 포인터와 다르게 모든 callable object들(함수객체, 람다, std::bind...)을 가리킬 수 있다.
함수 signature에 따른 템플릿으로 동작한다. detail
위의 예제 derefUPLess 람다 함수의 경우

   bool(const std::unique_ptr<Widget>&,
        const std::unique_ptr<Widget>&) //derefUPLess의 signature

   std::function<bool(const std::unique_ptr<Widget>&,
                      const std::unique_ptr<Widget>&)> derefUPLess //템플릿 선언