자동 (형식 추론) 키워드
선언 된 초기화 식에서 변수의 형식을 추론합니다.
auto declarator initializer;
설명
auto 키워드 선언 된 변수는 초기화 식의 형식 추론에 사용 하도록 컴파일러에 지시 합니다.
[!참고]
전에 Visual C++ 2010, auto 키워드 자동 저장소 클래스 지정자를 했습니다.해당 사용은 이제 오류가 발생합니다./Zc:auto 기본 형식인 컴파일러 옵션, 새로운 의미를 사용 하도록 컴파일러는 auto 키워드입니다.
사용 하는 것이 좋습니다 있는 auto 대부분의 상황에 대 한 키워드-시겠습니까 변환 하지 않는 한-이러한 이점이 있기 때문에:
견고성: 식의 형식을 변경 하는 경우-함수의 반환 형식을 변경 하는 경우가이 해당-바로 작동 합니다.
성능: 변환이 될 것을 보장 하 고 있습니다.
사용 범위: 형식 이름 맞춤법 문제 및 오타에 대 한 걱정할 필요가 없습니다.
효율성: 코딩을 더 효율적일 수 있습니다.
변환 경우에 않을 수 auto.
특정 형식 및 아무것도 하지 것입니다.
식 템플릿 도우미 형식-예를 들어, (valarray+valarray) 및 이니셜라이저 목록-거의 작성 하도록 선택할 수 있지만 auto x = { 1 }; 와 실제로 얻을 것으로 예상 되는 int.
사용 하는 auto 키워드를 형식 대신를 사용 하는 변수를 선언 하 고 초기화 하는 식을 지정 합니다.In addition을 수정할 수는 auto 같은 지정자 및 선언 자 사용 하 여 키워드 const, volatile, 포인터 (*), 참조 (&), rvalue 참조 하 고 (&&).컴파일러는 초기화 식을 계산한 다음 해당 정보를 사용하여 변수의 형식을 추론합니다.
초기화 식 (등호 기호 구문)에 직접 초기화 (함수 스타일 구문) 할당 될 수 있습니다 또는 new 연산자 식입니다.또는 초기화 식이 될 수 있습니다는 에 대 한 범위에서 선언 매개 변수는 범위 기반 for 문(C++) 문.자세한 내용은 이니셜라이저 및이 문서의 뒷부분에 나오는 코드 예제입니다.
auto 키워드는 형식에 대 한 자리 표시자 이지만 그 자체가 아닌 형식입니다.따라서, auto 키워드는 sizeof 및 typeid와 같은 캐스트나 연산자에서 사용되지 못합니다.
유용성
auto 키워드는 복잡한 형식의 변수를 선언하는 간단한 방법입니다.예를 들어, 사용할 수 있습니다 auto 위치는 초기화 식이 포함 되어 템플릿, 함수에 대 한 포인터 또는 포인터에 멤버 변수를 선언 합니다.
또한 사용할 수 있습니다 auto 선언 하 고 초기화 하는 변수는 람다 식입니다.람다 식의 형식은 컴파일러에만 알려져 있기 때문에 직접 형식의 변수를 선언할 수 없습니다.자세한 내용은 람다 식의 예제을 참조하십시오.
사용 하면 auto와 함께 decltype 템플릿 라이브러리를 작성 하는 데 도움이 되는 지정자를 입력 합니다.auto와 decltype을 사용하여 반환 형식이 템플릿 인수의 형식에 따라 달라지는 템플릿 함수를 선언합니다.또는 auto 및 decltype을 사용하여 다른 함수에 대한 호출을 래핑한 후 다른 함수의 반환 형식을 반환하는 템플릿 함수를 선언합니다.자세한 내용은 decltype 형식 지정자을 참조하십시오.
제한 및 오류 메시지
다음 표는 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();
변수의 형식은 다음 코드 단편은 선언 iter 및 elem 때의 for 범위 for 루프 시작.
// 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.
이 코드 단편 조건부 연산자를 사용 하 여 (?:) 변수를 선언 하려면 x 200의 값이 정수:
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;
//...
}