[effective modern c++] 항목 6 : auto가 원치 않은 형식으로 연역될 때에는 명시적 형식으로 초기화하자.

2016. 9. 10. 22:06프로그래밍/Effective Modern C++

728x90
728x90

개요

auto를 사용해서 변수를 선언하면 형식을 명시적으로 지정했을 때보다 기술적으로 여러 강점이 있다.

But, 가끔 auto가 이상한 짓을 한다.


std::vector<bool> features(const Widget& w);


라고 쳤을 때


코드

bool highPriority = featrues(w)[5];


processWidget(w, highPriority);


문제점

여기서 highPriority의 bool을 auto로 변경하면?


processWidget은 미정의 행동이 된다.


Why?

std::vector<bool>에서 std::vector::operator[]가 돌려주는 것은 bool 형이 아니라 

std::vector<bool>::reference 형식의 객체를 리턴한다.

이는 대리자 클래스(proxy class)로 다른 어떤 형식의 행동을 흉내 내고 보강하는 클래스다.


> 프록시 패턴 좀 봐야겠다.


이 객채는 bool당 1비트의 압축된 형태로 표현하도록 명시되어 있기 때문이다.


Matrix sum = m1 + m2 + m3 + m4;


와 같은 형태일 때 oprator+가 Sum<Matrix, Matrix> 같은 대리자 클래스의 객체를 돌려준다면?

Sum<Sum<...<Matrix, Matrix>, Matrix...>

이런 느낌으로... 여튼 대리자 클래스는 auto와 잘 맞지 않는다.


정리

auto someVar = "보이지 않는" 대리자 클래스 형식의 표현식;


기억해 둘 사항들

- 보이지 않는 대리자 형식 때문에 auto가 초기화 표현식의 형식을 잘못 연역할 수 있다.

- 형식 명시 초기치 관용구는 auto가 원하는 형식을 연역하도록 강제한다.

728x90
반응형