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에 따라 참조 타입이 달라집니다.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();)조심할 곳:
int vs size_t vs double)| 실수 | 문제 |
|---|---|
for (auto x : bigVec) 남발 | 불필요한 복사 비용 |
const 객체를 auto로 받음 | const가 제거되어 값 복사됨 |
auto + {}를 항상 일반 변수로 오해 | initializer_list 추론 가능 |
타입 의도가 중요한 코드까지 auto로 통일 | 가독성/의도 전달 저하 |
auto, auto&, const auto&를 각각 언제 선택해야 하는가?const int x를 auto y = x;로 받으면 왜 y는 const가 아닌가?