다음을 통해 공유


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

유용성

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 키워드와 컴파일러가 표시하는 해당 진단 오류 메시지를 이용하여 제약사항을 나열합니다.

오류 번호

설명

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(); 

다음 코드 단편은 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;
    //...
}

참고 항목

참조

auto 키워드

저장소 클래스 지정자

C++ 키워드

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

sizeof 연산자

typeid

operator new(<new>)

선언

람다 식의 예

이니셜라이저

decltype 형식 지정자