auto keyword {C++}
auto의 세가지 얼굴#
- 일반 auto: 2번을 포함하는 타입
auto *
: 포인터 변수의 타입을 추론할때 사용, 굳이*
넣지 않아도 됨auto &
: 레퍼런스 변수의 타입을 추론할때 사용.&
를 넣지 않으면 복사가 됨. 만약 복사 연산자operator=
가 delete 됐다면?
auto로 광명찾은 iterator들#
std::vector<int>::iterator
라는 거대한 길이의 타입을 auto
만으로 충분하게 되었다.
for (const auto & elem : vec) {
std::cout << elem << std::endl;
}
auto functions#
리턴타입을 파이썬처럼 뒤에다 쓸 수 있다.
auto fun() -> int {
return 1;
}
- C++14부터 리턴타입을 굳이 적지 않더라도 컴파일러가 return문을 확인하고 추론할 수 있다고 한다. return statement가 없으면 void
int x = 1;
auto f() { return x; } // return type is int
const auto & f() { return x; } // return type is const int &
Initializer_list와 auto#
C++17 이전
auto a = {1}; // std::initializer_list<int>
auto b{1}; // std::initializer_list<int>
auto c = {1, 2}; // std::initializer_list<int>
auto d{1, 2}; // std::initializer_list<int>
C++ 17 부터 아래와 같이 두 가지 형태로 구분해서 auto
타입이 추론됩니다.
auto x = {arg1, arg2...}
형태의 경우arg1
,arg2
... 들이 모두 같은 타입이라면x
는std::initializer_list<T>
로 추론됩니다.auto x {arg1, arg2, ...}
형태의 경우 만일 인자가 단 1 개라면 인자의 타입으로 추론되고, 여러 개일 경우 오류를 발생시킵니다.
auto a = {1}; // 첫 번째 형태이므로 std::initializer_list<int>
auto b{1}; // 두 번째 형태 이므로 그냥 int
auto c = {1, 2}; // 첫 번째 형태이므로 std::initializer_list<int>
auto d{1, 2}; // 두 번째 형태 인데 인자가 2 개 이상이므로 컴파일 오류