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
를 붙여야 안전하고 효율적인 코드를 작성할 수 있어요.