Auto
항목 6 : auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라.
컨테이너를 참조하는 operation[]은 보통 &T를 돌려주지만 bool의 경우는 다르다.
왜냐하면 C++에서는 bool처럼 bit에 대한 형식에 대해서 참조하는 것이 금지되어 있다.
std::vector<bool> features(const Widget& w);
Widget w;
auto highPriority = features(w)[5];
// 임시객체 vector<int> 파괴된다.
processWidget(w, highPriority);
위 코드를 보았을 때 bool일 경우 이야기 해보자!
1. features는 처음에 임시객체 vector을 return한다.
2. 임시객체 vector의 5번 객체를 찾아서 std::vector::reference를 반환한다.
3. 하지만, 임시객체 vector은 문장의 끝에서 사라진다.
4. highPriority의 포인터는 대상을 잃은 포인터가 된다.
이럴 경우에는 명시를 하는 것이 옳다.
bool highPriority = feautures(w)[5];
대리자 클래스(proxy class) : 다른 어떤 형식의 행동을 흉내 내고 보강하는 것
대리자 클래스는 container나 template같은 곳에서 형식의 행동을 흉내내고 보강하는데 사용이 되고 있다.
하지만, 중요한 것은 대리자 클래스는 "보이지 않기"때문에 auto를 쓸 때 불안요소가 된다는 점과
보통 한 문장이상 유지되도록 되어 있지 않기 때문에 미정의 행동을 할 수 있다는 것이다.
auto someVar = "보이지 않는" 대리자 클래스 형식의 표현식;
위와 같은 문장은 피하고 명시해주는 것이 좋다.
대리자(Proxy) 객체가 쓰이고 있는지 파악하는 방법
아래 코드의 reference operator[](size_type n); 생소해보인다. 보통 operator[]가 &T를 반환해주기 때문에 아래와 같이 생소한 코드를 보게 되면 대리자 클래스가 쓰이고 있다고 볼 수 있다.
namespace std {
template <class Allocator>
class vector<bool, Allocator> {
public :
...
class reference { ... };
reference operator[](size_type n);
...
}
auto를 연역하길 원하는 형식으로 casting하는 방법
아래와 같이 원하는 형식으로 casting을 하면 가독성 및 미정의 행동 모두를 예방 할 수 있다.
auto highPriority = static_cast<bool>(features(w)[5]);
'Language > effective modern C++' 카테고리의 다른 글
현대적 C++에 적응하기 (0) | 2021.10.17 |
---|---|
Effective modern C++ ( Auto ) (0) | 2021.10.16 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.10.14 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.09.26 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.09.22 |
댓글