티스토리 뷰
[Effective Modern C++] 항목 6. auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라
pppgod 2019. 9. 8. 00:50이전 포스트에서는 auto 를 써야하는 이유를 보았다면 이번 글에서는 auto 를 사용할 때, 주의해야하는 점을 알아보도록 하자.
std::vector<bool>::reference
vector<bool>::reference 가 무엇인지 아는 사람은 드물것이다. 먼저 vector<bool> 에 대해 생각해보자. bool 형식을 원소로 갖는 배열을 의미한다. 여기서 bool 의 특징을 생각해보자. bool 은 true, false 만 저장하는데도 속도를 위해 1byte 의 크기를 갖고 있다. 그런데 우리는 bool 배열을 사용할 것이기 때문에 굳이 1byte만 사용하지 않아도 된다. 1bit에 1개의 원소를 저장해도 아무런 문제가 없다. 이를 bool 처럼 사용하게 해주는 컨테이너가 바로 vector<bool>::reference 이다. 여기서 auto 를 사용하면 어떻게 될까?
vector<bool> bools;
...
bool highPriority = bools[5];
auto highPriority = bools[5];
bool 일 때와 auto 일 때의 결과는 완전히 다르다. bool 일 때는 형식 연역이 일어나지만 auto 는 vector<bool>::reference 가 된다. 그런데 여기서 만약 bools 가 소멸된다면 문제가 발생한다. bool 로 선언했다면 값은 복사되어 아무런 문제가 없지만 auto 의 경우 원본이 사라져서 dagling pointer 가 되버리고 만다. 이는 큰 문제가 될 수 있다. 이를 어떻게 해결 할 수 있을까?
static_cast
위의 문제를 해결하는 것이 바로 타입 캐스팅이다. 그 중에서도 static_cast를 이용하면 위와 같은 문제를 미연에 방지할 수 있다.
auto highPriority = static_cast<bool>(bools[5]);
이제 highPriority는 bool 타입이 되어 위와 같은 문제를 회피 할 수 있다.
참고 서적
스콧 마이어스, Effective Modern C++
'C++ > Effective Modern C++' 카테고리의 다른 글
[Effective Modern C++] 항목 9. typedef보다 별칭 선언을 선호하라 (0) | 2019.09.28 |
---|---|
[Effective Modern C++] 항목 7. 객체 생성 시 괄호(())와 중괄호({})를 구분하라 (0) | 2019.09.21 |
[Effective Modern C++] 항목 5. 명시적 형식 선언보다는 auto를 선호하라 (0) | 2019.09.08 |
[Effective Modern C++] 항목 4. 연역된 형식을 파악하는 방법을 알아두라 (0) | 2019.09.02 |
[Effective Modern C++] 항목 3. decltype의 작동 방식을 숙지하라 (0) | 2019.09.02 |
- Total
- Today
- Yesterday
- 발아시기
- 람다
- Perfect
- Modern
- thread
- Overloading
- Future
- std::move
- 보편 참조
- C++11
- Unreal
- std::forward
- auto
- Forwarding
- async
- 보편참조
- MOVE
- Join
- C++
- C++14
- Effective Modern C++
- const
- C
- forward
- Override
- CPP
- 다이소
- Effective
- detach
- 포인터
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |