auto(C++)

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

참고 항목

C++ 표준은 이 키워드(keyword) 대한 원래 의미와 수정된 의미를 정의합니다. Visual Studio 2010 auto 이전에는 키워드(keyword) 자동 스토리지 클래스에서 변수를 선언합니다. 즉, 로컬 수명이 있는 변수입니다. Visual Studio 2010 auto 부터 키워드(keyword) 선언의 초기화 식에서 형식이 추론된 변수를 선언합니다. /Zc:auto[-] 컴파일러 옵션은 키워드(keyword) 의미를 auto 제어합니다.

구문

autodeclaratorinitializer;

[](autoparam1, autoparam2) {};

설명

auto 키워드(keyword) 컴파일러가 선언된 변수 또는 람다 식 매개 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 지시합니다.

이러한 이점을 제공하기 때문에 변환을 auto 실제로 원하지 않는 한 대부분의 상황에 키워드(keyword) 사용하는 것이 좋습니다.

  • 견고성: 함수 반환 형식이 변경될 때를 포함하여 식의 형식이 변경되면 작동합니다.

  • 성능: 변환이 없음을 보장합니다.

  • 유용성: 형식 이름 맞춤법 오류 및 오타에 대해 걱정할 필요가 없습니다.

  • 효율성: 코딩이 더 효율적일 수 있습니다.

사용하지 auto않으려는 변환 사례:

  • 특정 형식을 원하고 다른 어떤 작업도 수행하지 않습니다.

  • 식 템플릿 도우미 형식(예: .) (valarray+valarray)

키워드(keyword) 사용 auto 하려면 형식 대신 사용하여 변수를 선언하고 초기화 식을 지정합니다. 또한 지정자 및 선언자(예: const, 포인터(), 참조() 및 rvalue 참조&(&&*)를 사용하여 키워드(keyword) 수정 auto 할 수 volatile있습니다. 컴파일러는 초기화 식을 계산하고 해당 정보를 사용하여 변수의 형식을 추론합니다.

초기화 식은 auto 다음과 같은 여러 가지 형태를 취할 수 있습니다.

  • 유니버설 초기화 구문(예: auto a { 42 };.
  • 대입 구문(예: auto b = 0;.)
  • 다음과 같은 auto c = { 3.14159 };두 개의 이전 형식을 결합하는 유니버설 할당 구문입니다.
  • 직접 초기화 또는 생성자 스타일 구문(예: auto d( 1.41421f );.

자세한 내용은 이 문서의 뒷부분에 있는 이니셜라이저 및 코드 예제를 참조하세요.

범위 기반 for 문에서 루프 매개 변수를 선언하는 데 사용되는 경우 auto 예를 들어 for (auto& i : iterable) do_action(i);다른 초기화 구문을 사용합니다. 자세한 내용은 범위 기반 for 문(C++)을 참조하세요.

auto 키워드(keyword) 형식의 자리 표시자이지만 그 자체가 형식이 아닙니다. 따라서 auto 키워드(keyword) C++/CLItypeid와 같은 sizeof 캐스트 또는 연산자에서 사용할 수 없습니다.

유용성

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

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

후행 반환 형식

형식 지정자와 함께 decltype 사용하여 auto템플릿 라이브러리를 작성할 수 있습니다. decltype 반환 형식이 템플릿 인수의 형식에 따라 달라지는 함수 템플릿을 사용하고 auto 선언합니다. 또는 다른 함수에 대한 호출을 래핑한 다음 다른 함수의 반환 형식을 반환하는 함수 템플릿을 사용하고 autodecltype 선언합니다. 자세한 내용은 decltype를 참조하세요.

참조 및 cv 한정자

삭제 참조, const 한정자 및 volatile 한정자를 사용합니다auto. 다음 예제를 참조하세요.

// 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 11이 아닙니다11 12.

중괄호가 있는 이니셜라이저를 사용한 형식 추론(C++14)

다음 코드 예제에서는 중괄호를 사용하여 변수를 auto 초기화하는 방법을 보여 줍니다. B와 C의 차이점과 A와 E의 차이점을 확인합니다.

#include <initializer_list>

int main()
{
    // std::initializer_list<int>
    auto A = { 1, 2 };

    // std::initializer_list<int>
    auto B = { 3 };

    // int
    auto C{ 4 };

    // C3535: cannot deduce type for 'auto' from initializer list'
    auto D = { 5, 6.7 };

    // C3518 in a direct-list-initialization context the type for 'auto'
    // can only be deduced from a single initializer expression
    auto E{ 8, 9 };

    return 0;
}

제한 사항 및 오류 메시지

다음 표에서는 키워드(keyword) 사용에 auto 대한 제한 사항과 컴파일러가 내보내는 해당 진단 오류 메시지를 보여 줍니다.

오류 번호 설명
C3530 auto 키워드(keyword) 다른 형식 지정자와 결합할 수 없습니다.
C3531 키워드(keyword) 선언 auto 된 기호에는 이니셜라이저가 있어야 합니다.
C3532 형식을 선언하기 auto 위해 키워드(keyword) 잘못 사용했습니다. 예를 들어 메서드 반환 형식 또는 배열을 선언했습니다.
C3533, C3539 매개 변수 또는 템플릿 인수는 키워드(keyword) 사용하여 auto 선언할 수 없습니다.
C3535 메서드 또는 템플릿 매개 변수는 키워드(keyword) 사용하여 auto 선언할 수 없습니다.
C3536 기호를 초기화하기 전에는 사용할 수 없습니다. 실제로 변수를 사용하여 자신을 초기화할 수 없다는 의미입니다.
C3537 키워드(keyword) 선언된 형식으로 auto 캐스팅할 수 없습니다.
C3538 키워드(keyword) 사용하여 선언된 선언자 목록의 auto 모든 기호는 동일한 형식으로 확인되어야 합니다. 자세한 내용은 선언 및 정의를 참조 하세요.
C3540, C3541 sizeoftypeid 연산자는 키워드(keyword) 선언된 기호에 auto 적용할 수 없습니다.

예제

이러한 코드 조각은 키워드(keyword) 사용할 수 있는 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.

다음 선언은 동일하지만 두 번째 선언이 첫 번째 선언보다 간단합니다. 키워드(keyword) 사용하는 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;

다음 코드 조각은 형식에 대한 변수x, 형식int에 대한 참조에 대한 변수 y 및 형식const int을 반환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;
    //...
}

참고 항목

키워드
/Zc:auto (추론 변수 형식)
sizeof 연산자
typeid
operator new
선언 및 정의
람다 식의 예
Initializers
decltype