2016. 9. 10. 22:06ㆍ프로그래밍/Effective Modern C++
개요
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가 원하는 형식을 연역하도록 강제한다.
'프로그래밍 > Effective Modern C++' 카테고리의 다른 글
[effective modern c++] 항목 5 : 명시적 형식 선언보다는 auto를 선호하라 (0) | 2016.08.14 |
---|---|
[effective modern c++] 항목 4: 연역된 형식을 파악하는 방법을 알아두자 (2) | 2016.07.16 |
[effective modern c++] 항목 3: decltype의 작동 방식 숙지 (2) | 2016.07.16 |
[effective modern c++] 항목 2 : auto 연역 규칙 (0) | 2016.03.01 |
[effective modern C++] 항목 1 : 템플릿 형식 연역 규칙 숙지 (2) | 2016.03.01 |