auto, 그냥 쓰면 안 되는 이유복사 vs 참조 vs 이동, 제대로 이해하고 쓰자!
C++에서 auto는 편리하지만, &, &&, const가 붙느냐에 따라 타입 추론 방식과 코드 의미가 완전히 달라집니다.
특히 rvalue 참조, 수명 연장, 복사 비용과 관련된 중요한 차이를 정확히 알아야 합니다.
이번 글에서는 auto의 모든 형태를 간단한 예시와 함께 정리해드립니다.
| 사용 형태 | 설명 | rvalue 가능? | lvalue 가능? | 컴파일 가능 여부 |
|---|---|---|---|---|
auto | 값을 복사 또는 이동함 | ✅ | ✅ | ✅ OK |
const auto& | 상수 참조. 임시 객체(rvalue)에도 바인딩 가능 | ✅ | ✅ | ✅ OK |
auto& | 일반 참조. lvalue만 허용, rvalue는 에러 | ❌ | ✅ | ✅ (단 rvalue 불가) |
auto&& | universal reference. 모든 값에 바인딩 가능 | ✅ | ✅ | ✅ OK |
auto — 복사 또는 이동 (value 타입)auto x = getValue(); // 복사 또는 move
x는 값 그 자체입니다.const auto& — 상수 참조 (읽기 전용 참조)const auto& s = std::string("hello");
auto& — 일반 참조 (수정 가능한 참조)auto& ref = myVar; // ✅ OK
auto& ref2 = std::string("temp"); // ❌ 에러: rvalue는 불가
auto&& — Universal Reference (모든 값 참조)auto&& ref = getValue(); // getValue()는 rvalue → rvalue ref
auto&& ref2 = someVar; // someVar는 lvalue → lvalue ref
std::move와 함께 사용할 경우, 명시적 rvalue 참조로 활용됨| 형태 | 비유 설명 |
|---|---|
auto | 📦 값을 복사해서 내 공간에 둠 |
const auto& | 🔍 남의 물건을 읽기만 함 (복사 없음) |
auto& | 🛠 남의 물건을 직접 만짐 (복사 없음) |
auto&& | 🚚 상황 따라 넘기기도 하고 직접 만지기도 함 |
| 상황 | 추천 타입 |
|---|---|
| 함수 반환값을 복사해서 쓸 때 | auto |
| 함수 반환값을 읽기 전용 참조할 때 | const auto& |
| 지역 변수나 멤버를 참조하여 수정할 때 | auto& |
| 템플릿에서 전달된 인자를 효율적으로 다룰 때 | auto&& |
std::string getName();
void example() {
auto s1 = getName(); // 복사 or 이동
const auto& s2 = getName(); // 수명 연장, 참조
auto& s3 = s1; // OK: lvalue
// auto& s4 = getName(); // ❌ 오류: rvalue 참조 불가
auto&& s5 = getName(); // OK: universal reference
}
C++의
auto는 단순한 자동 타입 추론 그 이상입니다.
복사, 참조, 수명 관리, 성능 최적화까지 모두 영향을 주는 만큼,
상황에 맞게&,&&,const를 붙여야 안전하고 효율적인 코드를 작성할 수 있어요.