C++에서 auto 키워드 (C++11부터)는 컴파일러가 초기화 표현식에서 변수의 타입을 자동으로 추론할 수 있게 해줍니다. 이는 긴 타입(예: 반복자, 람다, 템플릿 표현식 작업 시)과의 작업을 간소화하고 코드의 가독성을 높입니다.
사용 예시:
auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // 반복자
하지만, auto는 제공된 값에 기반하여 타입을 추론합니다. 예를 들어, 값에 의해 반환할 경우 auto는 값을 주지만, 참조에 의한 경우에는 참조를 줍니다. 참조, 포인터, const 수식자와 작업 시 주의가 필요합니다.
중요한 예:
std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // 복사, v는 변경되지 않음 for (auto& x : v) x = 0; // 참조, 요소들이 0으로 초기화됨
표현식
const auto z = foo();에서 'z' 변수의 타입은 무엇입니까?foo()메소드가 int에 대한 참조 (int&)를 반환하는 경우?
답변:
const auto z는 반환이 참조라 하더라도 타입을 int (값)로 추론합니다. 참조를 추론하려면 auto& z가 필요합니다. const 수식자는 타입 추론 후에 적용됩니다.
예시:
int x = 5; auto a = x; // a — int auto& b = x; // b — int& const auto c = x; // c — const int auto d = foo(); // d — int (만약 foo가 int를 반환하면) auto& e = foo(); // e — int&
이야기
큰 웹 서비스에서 스마트 포인터로 구성된 컬렉션에 대해 auto 대신 auto&와 함께 범위 기반 for를 사용했습니다. 이로 인해 객체 복사가 발생하여 수백만 개의 레코드를 처리할 때 프로그램 속도가 16배 느려졌습니다.
이야기
그래프 작업 라이브러리에서 auto가 반환된 반복자에 사용되었고 이를 참조라고 기대했지만 임시 객체가 반환되었습니다. 반복자가 너무 일찍 파괴되어 루프 후 프로그램이 UB에 빠졌습니다.
이야기
금융 시스템에서 map에서 값을 얻기 위해 auto를 사용하면서 키의 constness를 잊은 때가 있었고, 이는 비상수 참조를 통한 데이터 수정 시도와 함께 컴파일 오류 및 런타임 크래시로 이어졌습니다.