Item 5. Prefer auto to explicit type declaration
auto
의 가장 큰 강점은, 초기화되는 값이 제공되어야 그 값으로부터 type를 연역하므로, 초기와 없는 선언에 의한 실수를 방지할 수 있다는 것이다auto x;
=> invalid
- auto를 썼을 때의 역효과도 거의 없다.
- std::function을 담을 때 유리한 점이 많다
- std::function은 하나의 stl template임 (closure)
- auto로 선언된 closure 변수는 요구되는 만큼의 메모리만 사용한다. 하지만 std::function으로 선언하게 되면 고정 크기를 가지고 추가 용량은 힙에서 가져오게 됨
- 장점
- 메모리 소비 적음
- std::function변수에 대한 inlining 제한 등이 덜 해 optimization 기회 늘어남
- std::function 정의는 OOM 발생 가능
- 쓰기 편함
- 값의 type을 잘 모를 때 발생하는 이상한 casting을 막을 수 있음
- 복잡한 자료구조의 내부 변수를 접근할 때 auto로 접근하지 않으면 의도하지 않은 초기화/복사를 마구 유발할 수 있음. 이 부분이 compiler에 의해 대체되므로 더 강력함.
- 물론
auto
자체가 type deduction의 영역에서 functional programming언어들에 비해 혁신적인 성과를 낸 것은 없다. 하지만 그 자체로 많은 도움이 된다. - auto를 쓰면 refactoring cost가 줄어들기도 함.
Item 6. Use explicit type initialization when auto fails to deduct to unwilled type
- 내가 의도하지 않은 경우
vector<bool> features();
auto highPriority = features()[5];
process(highPriority);
여기서 highPriority
는 bool이 아니라 vector<bool>::reference
의 객체이다. 하지만 vector<bool>
은 내부적으로 1bit를 가지기 때문에 Cpp에서는 비트에 대한 참조가 금지되어 있다.
이걸 전달하게 되면 vector<bool>
에 대한 dangling pointer가 전달되고 미정의 행동을 유발한다.
- 그래서 내부적으로
std:vector<bool>::reference
는 Proxy class로써 이러한 semantics를 처리하게 된다.- Proxy class의 다른 예에는 smart pointer(unique pointer, shared pointer)이다.
- 이러한 Proxy pattern이 프로그래머에게 잘 드러나지 않는 경우(reference의 예임. unique_ptr는 숨겨진 경우임)에 이는 auto class의 사용과 잘 맞지 않는다.
- 이러한 class들은 객체의 수명이 한 문장 안에 끝난다는 가정이 있기 때문에, 중간에 auto를 둠으로써 변수를 생성하게 되면 라이브러리의 수많은 가정을 깨게 되며 예상 밖의 행동을 할 수 있다.
auto
로 선언하되 그 type를 명시하고 싶다면 아래의 패턴을 사용할 것,auto x = static_cast<bool>(...)