auto

auto 사용 기준

auto는 초기화 식에서 타입을 추론한다. 읽는 사람이 소유권, 참조, const, narrowing 여부를 놓치지 않을 때만 코드가 더 좋아진다.

01

참조 여부 선택

복사할 값이면 auto, 원본을 바꿀 값이면 auto&, 읽기만 할 큰 객체면 const auto&를 쓴다.

02

타입 손실 확인

프록시 타입, initializer_list, signed/unsigned 변환처럼 의도와 다른 추론을 점검한다.

03

독자에게 힌트를 남긴다

반환 타입이 의미를 설명하는 도메인 객체라면 명시 타입이 더 읽기 쉽다.

auto
값 복사 참조와 top-level const가 보통 떨어져 나간다.
큰 객체 순회에서는 비용이 생긴다.
auto&
원본 참조 컨테이너 원소를 수정하거나 복사를 피할 때 쓴다.
수명은 원본 컨테이너에 묶인다.
const auto&
읽기 참조 복사를 피하면서 수정은 막는다.
범위 for의 기본 선택지다.
decltype(auto)
정확한 반환 보존 참조 반환 여부까지 그대로 유지한다.
라이브러리 코드에서 신중히 쓴다.

복사 비용 · 수명 · 가독성 점검

복사 비용 range-for에서 auto로 큰 객체를 매번 복사하고 있지 않은가.
수명 auto&&나 decltype(auto)가 임시 객체 참조를 밖으로 내보내지 않는가.
가독성 초기화 식만 보고 실제 타입과 의미를 충분히 알 수 있는가.

순회 타입 선택

for (const auto& user : users) {
    render(user.name());
}

for (auto& score : scores) {
    score.normalize();
}