생성자가 있는 변수를 선언할 때는 명시적으로 지정하지 않아도 된다. 대신 변수가 초기화 유형을 가지게 할 수 있다.
int a1 = 123;
char a2 = 123;
auto a3 = 123; // a3의 유형은 int가 된다.
정수 literal 타입인 123은 int 다. 그래서 a3은 int가 된다. auto는 초기화되는 유형의 자리 표시자가 된다.
물론 int와 같은 간단한 표현식에서 auto를 사용하는 것은 이점이 없다.
유형이 복잡하고 사용하기 어려울수록 auto는 유용해진다.
template<class T> void f1(vector<T>& arg)
{
for (vector<T>::iterator p = arg.begin(); p!=arg.end(); ++p)
∗p = 7;
for (auto p = arg.begin(); p!=arg.end(); ++p)
∗p = 7;
}
auto를 사용하는 루프는 쓰기가 더 쉽고 읽기가 더 쉽다. 또한 더 탄력적으로 사용할 수 있다.
예를 들어 변경 사항을 코딩할 경우 arg 목록을 변경하면 auto를 사용하는 루프는 여전히 올바르게 작동하지만 첫 번째 루프는 다시 작성해야 한다. 따라서 하지 말아야 할 정당한 이유가 없는 한, 작은 범위에서 auto를 권장한다.
범위가 큰 경우 유형을 명시적으로 언급하면 오류를 바로 잡아내는데 도움이 될 수 있다. 즉 auto를 사용하면 오류를 찾기 어려운 경우가 발생한다.
void f(double d)
{
constexpr auto max = d+7;
int a[max]; // error : array bound not an integer
// ...
}
auto는 일반적으로 작은 기능으로 만들어 쓰는 것이 좋다.
유형 및 선언
cosnt와 & 와 같은 지정자와 수정자를 사용하여 유형을 알아낼 수 있다.
void f(vector<int>& v)
{
for (const auto& x : v) { // x is a const int&
// ...
}
}
여기서 auto는 v의 요소 유형, 즉 int에 의해 결정된다.
표현식에서 참조가 암시적으로 역참조 되기 때문에 표현식의 유형은 참조가 아니다.
예를 들면 다음과 같다.
void g(int& v)
{
auto x = v; // x is an int (not an int&)
auto& y = v; // y is an int&
}
auto와 {} 리스트
초기화하려는 객체의 유형을 명시적으로 언급할 때 고려해야 할 두 가지 유형, 즉 객체 유형과 초기화 유형이 있다.
char v1 = 12345; // 12345 is an int
int v2 = 'c'; // 'c' is a char
T v3 = f();
정의에 {} 초기화 구문을 사용하여 잘못된 변환 가능성을 최소화할 수 있다.
char v1 {12345}; // error : narrowing
int v2 {'c'}; // fine: implicit char->int conversion
T v3 {f()}; // works if and only if the type of f() can be implicitly converted to a T
auto를 사용할 때 초기화 유형만 관련되며 안전하게 사용할 수 있다.
auto v1 = 12345; // v1 is an int
auto v2 = 'c'; // v2 is a char
auto v3 = f(); // v3 is of some appropriate type
사실 auto와 = 구문을 함께 사용하는 것이 유리하다.
auto x0 {}; // error : cannot deduce a type
auto x1 {1}; // list of int with one element
auto x2 {1,2}; // list of int with two elements
auto x3 {1,2,3}; // list of int with three elements
T 유형 요소의 동종 목록 유형은 initializer_list<T> 유형으로 간주된다. 특히 x1의 유형은 int로 추론되지 않는다. 그렇다면 x2와 x3의 유형은 무엇일까?
결과적으로 list를 의미하지 않을 때에는 auto로 지정된 객체에 대해 {} 보다는 =를 사용하는 것이 좋다.
'Program Language > C & C++' 카테고리의 다른 글
[C++] 객체와 값 (0) | 2021.12.16 |
---|---|
[C++] decltype 지정자 (0) | 2021.12.16 |
[C++] 데이터 타입 (bool, char, integer, floating) (0) | 2021.12.16 |
[VS] Visual Studio Dependencies(종속성) 설정 (0) | 2021.12.06 |
[C++] namespace 사용 시 LNK2019 에러 발생 (0) | 2021.12.06 |