C++11 auto

Jaemyeong Lee·2024년 12월 7일

게임 서버1

목록 보기
87/220

auto의 본질

  • auto초기화 식으로부터 타입을 추론합니다.
  • 변수 선언에서 auto를 쓰려면 초기화가 필요합니다.
  • 타입 이름을 줄여 가독성을 높이되, "무슨 타입인지 전혀 보이지 않는 코드"는 피하는 것이 좋습니다.
auto x = 10;      // int
auto y = 3.14;    // double
auto ptr = &x;    // int*

핵심 추론 규칙

기본 auto는 top-level const와 참조를 제거

int a = 0;
int& ra = a;
const int ca = 10;

auto x1 = a;   // int
auto x2 = ra;  // int   (참조 제거)
auto x3 = ca;  // int   (top-level const 제거)

참조를 유지하려면 auto& / const auto&

auto& r1 = a;         // int&
const auto& r2 = ca;  // const int&

auto&& (심화)

auto&& rr1 = a;   // a는 lvalue -> int&
auto&& rr2 = 10;  // rvalue     -> int&&
  • auto&&는 전달받는 값의 value category에 따라 참조 타입이 달라집니다.
  • 템플릿/완벽 전달(perfect forwarding) 문맥에서 자주 등장합니다.

auto 추론 규칙 요약

초기화 식             auto x        auto& x         const auto& x      auto&& x
──────────────────    ─────────     ─────────      ──────────────      ─────────
int a                 int           int&           const int&          int&
const int ca          int           const int&     const int&          const int&
int& ra               int           int&           const int&          int&
10 (rvalue)           int           (불가)         const int&          int&&

중괄호 초기화({}) 주의

auto a = {1, 2, 3}; // std::initializer_list<int>
// auto b = {1, 2.0}; // 타입이 섞여 컴파일 에러
  • auto + {}initializer_list로 추론되는 경우가 있어 의도와 달라질 수 있습니다.
  • 학습 초반에는 헷갈리면 타입을 명시적으로 적는 것이 안전합니다.
vector<int> v{1, 2, 3}; // 의도가 명확

순회에서의 auto 선택 기준

for (auto item : vec) {          // 복사
    // 읽기 전용 + 작은 타입일 때 무난
}

for (auto& item : vec) {         // 비-const 참조
    item *= 2;                   // 원본 수정
}

for (const auto& item : vec) {   // const 참조
    // 복사 없이 읽기 전용 (권장 기본값)
}
  • 큰 객체(string, vector, 큰 struct)는 auto` 값 복사 비용이 큽니다.
  • 읽기 전용 순회는 const auto&를 기본으로 두면 안전하고 효율적입니다.

auto를 쓰면 좋은 곳 / 피할 곳

좋은 곳:

  • 이터레이터 타입이 길 때 (auto it = mp.begin();)
  • 람다 타입처럼 이름을 쓰기 어려울 때
  • 우변 타입이 명확할 때 (auto n = vec.size();)

조심할 곳:

  • 타입 자체가 의미를 전달하는 API 경계(예: int vs size_t vs double)
  • 의도치 않은 복사가 성능에 큰 영향을 주는 코드
  • 중괄호 초기화와 섞여 추론이 헷갈리는 코드

자주 하는 실수 + 체크 질문

자주 하는 실수

실수문제
for (auto x : bigVec) 남발불필요한 복사 비용
const 객체를 auto로 받음const가 제거되어 값 복사됨
auto + {}를 항상 일반 변수로 오해initializer_list 추론 가능
타입 의도가 중요한 코드까지 auto로 통일가독성/의도 전달 저하

체크 질문 (스스로 답해보기)

  • auto, auto&, const auto&를 각각 언제 선택해야 하는가?
  • const int xauto y = x;로 받으면 왜 yconst가 아닌가?
  • range-for에서 값 복사/참조/const 참조가 성능과 동작에 어떤 차이를 만드는가?

profile
李家네_공부방

0개의 댓글