auto
(C++)
초기화 식에서 선언된 변수의 형식을 추론합니다.
참고 항목
C++ 표준은 이 키워드(keyword) 대한 원래 의미와 수정된 의미를 정의합니다. Visual Studio 2010 auto
이전에는 키워드(keyword) 자동 스토리지 클래스에서 변수를 선언합니다. 즉, 로컬 수명이 있는 변수입니다. Visual Studio 2010 auto
부터 키워드(keyword) 선언의 초기화 식에서 형식이 추론된 변수를 선언합니다. /Zc:auto[-]
컴파일러 옵션은 키워드(keyword) 의미를 auto
제어합니다.
구문
auto
declaratorinitializer;
[](auto
param1, auto
param2) {};
설명
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
선언합니다. 또는 다른 함수에 대한 호출을 래핑한 다음 다른 함수의 반환 형식을 반환하는 함수 템플릿을 사용하고 auto
decltype
선언합니다. 자세한 내용은 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 | sizeof 및 typeid 연산자는 키워드(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
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기