다음을 통해 공유


자동 (형식 추론) 키워드

선언 된 초기화 식에서 변수의 형식을 추론합니다.

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 키워드는 sizeoftypeid와 같은 캐스트나 연산자에서 사용되지 못합니다.

유용성

auto 키워드는 복잡한 형식의 변수를 선언하는 간단한 방법입니다.예를 들어, 사용할 수 있습니다 auto 위치는 초기화 식이 포함 되어 템플릿, 함수에 대 한 포인터 또는 포인터에 멤버 변수를 선언 합니다.

또한 사용할 수 있습니다 auto 선언 하 고 초기화 하는 변수는 람다 식입니다.람다 식의 형식은 컴파일러에만 알려져 있기 때문에 직접 형식의 변수를 선언할 수 없습니다.자세한 내용은 람다 식의 예제을 참조하십시오.

사용 하면 auto와 함께 decltype 템플릿 라이브러리를 작성 하는 데 도움이 되는 지정자를 입력 합니다.auto와 decltype을 사용하여 반환 형식이 템플릿 인수의 형식에 따라 달라지는 템플릿 함수를 선언합니다.또는 auto 및 decltype을 사용하여 다른 함수에 대한 호출을 래핑한 후 다른 함수의 반환 형식을 반환하는 템플릿 함수를 선언합니다.자세한 내용은 decltype 형식 지정자을 참조하십시오.

제한 및 오류 메시지

다음 표는 auto 키워드와 컴파일러가 표시하는 해당 진단 오류 메시지를 이용하여 제약사항을 나열합니다.

오류 번호

설명

C3530

auto 키워드는 다른 형식 지정자와 함께 사용할 수 없습니다.

C3531

auto 키워드를 사용하여 선언된 기호에는 이니셜라이저가 있어야 합니다.

C3532

auto 키워드를 잘못 사용하여 형식을 선언했습니다.예를 들어, 메서드 반환 형식 또는 배열을 선언했습니다.

C3533, C3539

auto 키워드를 사용하여 매개 변수 또는 템플릿 인수를 선언할 수 없습니다.

C3534

new 식에서 auto 키워드를 사용하여 선언된 기호에는 이니셜라이저가 있어야 합니다.자세한 내용은 operator new (<new>)을 참조하십시오.

C3535

auto 키워드를 사용하여 메서드 또는 템플릿 매개 변수를 선언할 수 없습니다.

C3536

기호는 초기화되기 전에는 사용할 수 없습니다.실제로 변수 자체를 사용하여 변수를 초기화할 수 없다는 의미입니다.

C3537

auto 키워드로 선언되는 형식으로 캐스팅할 수 없습니다.

C3538

선언자 목록auto 키워드를 사용하여 선언된 선언자 목록의 모든 기호는 같은 형식으로 확인되어야 합니다.자세한 내용은 선언을 참조하십시오.

C3540, C3541

Sizeoftypeid 연산자는 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;
    //...
}

참고 항목

참조

키워드 자동

저장소 클래스 지정자

C + + 키워드

/Zc:auto(변수 형식 추론)

sizeof 연산자

typeid

operator new (<new>)

선언

람다 식의 예제

이니셜라이저

decltype 형식 지정자