-
Notifications
You must be signed in to change notification settings - Fork 0
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를 활용한 훨씬 간결한 선언
일반화된 함수 포인터 템플릿.
함수 포인터와 다르게 모든 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 //템플릿 선언