본문 바로가기
Language/effective modern C++

Effective modern C++ ( Auto )

by y.j 2021. 10. 16.
728x90

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]);
728x90

댓글