auto 키워드 (형식 추론)
초기화 식에서 선언된 변수의 형식을 추론합니다.
auto declarator initializer;
설명
이 auto 키워드 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시합니다.
이러한 혜택을 제공하기 때문에 대부분의 상황(실제로 전환을 원하지 않는 경우)을 위해 auto 키워드를 사용하는 것을 추천합니다.
견고성: 형식이 변화하는 경우(이는 함수의 반환 형식이 변화할 때를 포합합니다), 바로 작동합니다.
성능: 변환이 있을 것을 보장할 수 있습니다.
사용 범위: 형식 이름 맞춤법 문제 및 오타에 걱정할 필요가 없습니다.
효율성: 코딩하면 더 효율적일 수 있습니다.
이 auto 를 사용하기 원하지 않는 변환의 경우:
특정 형식 및 다른 경우를 수행합니다.
식 템플릿 도우미 형식(예로, (valarray+valarray) 와 초기화 목록)은 드물게 auto x = { 1 }; 쓰기를 선택하고 정말로 int 를 얻도록 기대합니다.
이 auto 키워드를 사용하려면, 변수를 선언하기 위한 형식을 대신 사용하고, 초기화 표현을 지정합니다. 또한 지정자 및 선언자( const, volatile), 포인터(*), 참조(&), 및 rvalue 참조( (&&)를 사용함으로써 auto 키워드를 수정할 수 있습니다. 컴파일러는 초기화 식을 계산한 다음 해당 정보를 사용하여 변수의 형식을 추론합니다.
초기화 식은 할당(등호 구문), 직접 초기화(함수-스타일 구문), operator new 식, 혹은 초기화 식은 범위 기반 for 문(C++) 상태의 for-range-declaration 매개변수가 있을 수 있습니다. 자세한 내용은 이니셜라이저 문서 뒷부분에 나오는 코드 예제를 보세요.
이 auto 키워드는 형식 그 자체가 아니라 형식을 위한 자리 표시자입니다. 따라서, auto 키워드는 sizeof 및 typeid와 같은 캐스트나 연산자에서 사용되지 못합니다.
유용성
auto 키워드는 복잡한 형식의 변수를 선언하는 간단한 방법입니다. 예를 들어, auto 사용를 사용할 수 있는 초기화 식에 템플릿, 함수에 대한 포인터 또는 멤버에 대한 포인터를 포함하는 변수를 선언합니다.
이 auto 키워드를 사용할 수 있고 변수를 람다 식에 선언 및 초기화합니다. 람다 식의 형식은 컴파일러에만 알려져 있기 때문에 직접 변수 유형을 선언할 수 없습니다. 자세한 내용은 람다 식의 예을 참조하십시오.
후행 반환 형식
이 auto 키워드를 decltype 형식 지정자와 함께 사용하여 템플릿 라이브러리를 작성합니다. 반환 형식이 해당 템플릿 인수의 형식에 종속되는 템플릿 함수를 선언하려면 auto 및 decltype을 사용하십시오. 또는 auto 및 decltype을 사용하여 다른 함수에 대한 호출을 래핑한 후 다른 함수의 반환 형식을 반환하는 템플릿 함수를 선언합니다. 자세한 내용은 decltype 형식 지정자을 참조하십시오.
Cv 한정자 및 참조
이 auto 사용하는 것은 참조, const 한정자 및 volatile 한정자를 삭제하는 것을 언급합니다. 다음 예제를 참조하십시오.
// cl.exe /analyze /EHsc /W4
#include <iostream>
using namespace std;
int main( )
{
int count = 10;
int& countRef = count;
auto myAuto = countRef;
countRef = 11;
cout << count << " ";
myAuto = 12;
cout << count << endl;
}
myAuto은 int 참조된 것이라고 생각할 수 있지만, 그렇지는 않습니다. 당순히 int를 auto 로써 삭제가 되어지지 않은 참조인 경우인 11 12 가 아니라 11 11 을 출력합니다.
제한 및 오류 메시지
다음 표는 auto 키워드와 컴파일러가 표시하는 해당 진단 오류 메시지를 이용하여 제약사항을 나열합니다.
오류 번호 |
설명 |
---|---|
auto 키워드는 다른 형식 지정자와 함께 사용할 수 없습니다. |
|
auto 키워드를 사용하여 선언된 기호에는 이니셜라이저가 있어야 합니다. |
|
auto 키워드를 잘못 사용하여 형식을 선언했습니다. 예를 들어, 메서드 반환 형식 또는 배열을 선언했습니다. |
|
auto 키워드를 사용하여 매개 변수 또는 템플릿 인수를 선언할 수 없습니다. |
|
new 식에서 auto 키워드를 사용하여 선언된 기호에는 이니셜라이저가 있어야 합니다. 자세한 내용은 operator new(<new>)을 참조하십시오. |
|
auto 키워드를 사용하여 메서드 또는 템플릿 매개 변수를 선언할 수 없습니다. |
|
기호는 초기화되기 전에는 사용할 수 없습니다. 실제로 변수 자체를 사용하여 변수를 초기화할 수 없다는 의미입니다. |
|
auto 키워드로 선언되는 형식으로 캐스팅할 수 없습니다. |
|
선언자 목록auto 키워드를 사용하여 선언된 선언자 목록의 모든 기호는 같은 형식으로 확인되어야 합니다. 자세한 내용은 선언을 참조하십시오. |
|
예제
코드 파편화는 auto 키워드를 사용되어져 방법을 설명합니다.
다음 선언은 동일한 의미를 갖습니다. 첫 번째 문에서 변수 j는 형식 int로 선언됩니다. 초기화 식(0)이 정수이기 때문에 두 번째 문에서 k 변수는 int 형식으로 추론됩니다.
int j = 0; // Variable j is explicitly type int.
auto k = 0; // Variable k is implicitly type int because 0 is an integer.
다음 선언은 동일 하지만 두 번째 선언의 첫 번째 선언보다 더 간단합니다. auto 키워드를 사용하는 가장 큰 이유 중 하나는 단순함입니다.
map<int,list<string>>::iterator i = m.begin();
auto i = m.begin();
다음 코드 단편은 for 와 for 루프가 시작될 때 범위와 변수 iter 및 elem 의 형식을 선언합니다.
// cl /EHsc /nologo /W4
#include <deque>
using namespace std;
int main()
{
deque<double> dqDoubleData(10, 0.1);
for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
{ /* ... */ }
// prefer range-for loops with the following information in mind
// (this applies to any range-for with auto, not just deque)
for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples
{ /* ... */ }
for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
{ /* ... */ }
for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
{ /* ... */ }
}
다음 코드 조각은 포인터를 선언하기 위해 new 연산자 및 포인터 선언을 사용합니다.
double x = 12.34;
auto *y = new auto(x), **z = new auto(&x);
다음 코드 단편은 각 선언문에서 여러 기호를 선언합니다. 각 명령문의 모든 기호는 동일한 형식으로 해결하는 것을 알립니다.
auto x = 1, *y = &x, **z = &y; // Resolves to int.
auto a(2.01), *b (&a); // Resolves to double.
auto c = 'a', *d(&c); // Resolves to char.
auto m = 1, &n = m; // Resolves to int.
다음 코드 단편은 정수 값을 200를 가지는 변수 x 를 선언하기 위해 조건부 연산자?:를 사용합니다:
int v1 = 100, v2 = 200;
auto x = v1 > v2 ? v1 : v2;
다음 코드 단편은 int 형식에 대한 x변수, const 형식의 참조에 대한 y 변수, int 형식을 반환하는 함수의 포인터에 대한 fp 변수를 초기화합니다.
int f(int x) { return x; }
int main()
{
auto x = f(0);
const auto & y = f(1);
int (*p)(int x);
p = f;
auto fp = p;
//...
}