-
항목5&6. auto를 선호하라Effective Modern C++ 2022. 7. 17. 23:21
항목5. auto를 선호하라
- auto 변수는 선언과 동시에 초기화를 시켜야한다. 그래서 변수 초기화 누락을 방지한다.
- auto 변수는 장황한 변수 선언을 피할 수 있다.
- auto 변수는 이식성이 좋다. (v.size() 의 반환 형식은 32비트에서와 64비트에서 다르다. 하지만 auto를 사용하면 두 상황에 대처할 수 있다.)
- auto 변수는 선언할 변수의 형식과 표현식의 형식 불일치 문제를 걱정할 필요가 없다.
- auto 변수는 리팩터링이 어느 정도 수월해진다. 어떤 함수의 반환 형식을 long에서 int로 변경했을 때 함수를 호출하는 코드에서 함수의 결과를 항상 auto변수에 저장했다면 다음 컴파일에 함수 호출 코드는 모두 자동으로 갱신된다.
항목6. auto가 원치않는 형식으로 연역될 때는 명시적 형식의 초기치를 사용하라
std::vector<bool> features(const Widget& w); Widget w; bool highPriority = features(w)[5]; processWidget(w, highPriority);highPriority의 형식을 auto로 바꾸면 문제가 생긴다.(컴파일은 됨)
auto highPriority = features(w)[5]; processWidget(w, highPriority); // 미정의 행동!std::vector의 operator[] 는 std::vector::reference 라는 대리자 클래스의 객체를 받기 때문에 auto를 사용하면 bool로의 암묵적 변환이 생략돼 std::vector::reference 객체의 복사본을 받게된다. 그 후 해당 문장의 끝에서 임시 객체가 파괴돼 highPriority의 포인터는 대상을 잃은 포인터가 되며, 그래서 processWidget 호출은 미정의 행동을 유발한다.
그렇기 때문에 다음과 같은 형태의 코드는 피해야 한다.
auto someVar = “보이지 않는” 대리자 클래스 형식의 표현식;
보이지 않는 대리자 클래스 형식들은 문서나 헤더 파일을 보면 확인 가능하다.
이런 일을 방지하려면 auto를 사용하지 않는 방법도 있지만 그것 보다는 명시적 형식의 초기치를 사용하면 좋다.
std::vector<bool> features(const Widget& w); Widget w; auto highPriority = static_cast<bool>(features(w)[5]);'Effective Modern C++' 카테고리의 다른 글
항목8. 0과 NULL보다 nullptr을 선호하라 (0) 2022.07.20 항목7. 객체 생성시 () 와 {} 를 구분하라 (0) 2022.07.19 항목4. 연역된 형식을 파악하는 방법 (0) 2022.07.14 항목3. decltype의 작동 방식을 숙지하라 (0) 2022.07.14 항목2. auto 형식 연역 규칙을 숙지하라 (0) 2022.07.14