ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 항목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]);
Designed by Tistory.