* 정의
auto를 이용해서 변수를 선언할 때 변수의 형식이 연역되는 방식을 의미한다.
* 동작 방식
- auto의 형식 연역
auto의 형식 연역 규칙은 템플릿의 형식 연역 규칙과 한 가지 예외를 제외하면 거의 유사하다. 경우에 예시와 함께 따라 간단히 정리하면 다음과 같다.
void Auto_Test(void)
{
int x = 3;
const int cx = x;
const int& crx = x;
// 1. 형식 지정자가 포인터나 참조 형식이지만 보편 참조가 아닌 경우
{
const auto& carx = crx; // 참조 무시되어 const int& 형식
auto& arx = cx; // const int& 형식
}
// 2. 형식 지정자가 보편 참조인 경우
{
auto&& arrx = x; // x는 int이자 왼값이므로 int& 형식
auto&& arrcx = cx; // cx는 const int이자 왼값이므로 const int& 형식
auto&& arr = 3; // 3은 int이자 오른값이므로 int&& 형식
}
// 3. 형식 지정자가 포인터도 아니고 참조도 아닌 경우
{
auto ax = cx; // const가 무시되어 int 형식
auto acrx = crx; // const와 참조가 무시되어 int 형식
}
// 배열
{
const char text[] = "hello";
auto aText = text; // const char* 형식
auto& arText = text; // const char (&)[6] 형식
}
// 함수
{
void function(int, int);
auto aFunction = function; // void (*)(int, int) 형식
auto& arFunction = function; // void (&)(int, int) 형식
}
}
- 템플릿과 auto의 형식 연역에서의 차이점
템플릿 형식 연역과 다른 점이 존재한다. 다음과 같은 예시에서 확인할 수 있다.
먼저 C++11에서 변수를 선언할 때 균일 초기화(uniform initialization)을 지원하는데 이러한 균일 초기화 기법을 auto에 적용시켜보면 결과가 다음과 같이 나온다.
# 균일 초기화는 중괄호 초기화라고도 하며 중괄호로 감싼 초기화를 의미한다.
auto x1 = 3; // int 형식
auto x2(3); // int 형식
auto x3{ 3 }; // int 형식
auto x4 = { 3 }; // std::initializer_list<int> 형식, 값은 { 3 }
x4의 경우 두 종류의 형식 연역이 진행된다. 먼저 변수 선언에 auto을 사용하였고, 초기치가 중괄호 형태이기 때문에 std::initializer_list 형식으로 연역된다. 여기서 std::initializer_list는 하나의 템플릿으로 어떤 형식 T에 대한std::initializer_list<T>이다. 반드시 T의 형식을 연역해야하기 때문에 여기서 3이 int 형식으로 연역이 진행된다.
결론적으로 auto 형식 연역과 템플릿 형식 연역의 차이는 auto는 중괄호 초기치가 std::initializer_list를 나타낸다고 가정하지만 템플릿 형식은 그렇지 않다는 것이다.
- auto를 함수 매개변수, 반환 형식에 사용
만약 auto를 함수 매개변수나 반환 형식에 사용한다면 템플릿 형식 연역 규칙이 적용된다.
'C++' 카테고리의 다른 글
| 스마트 포인터 개요 (0) | 2022.03.21 |
|---|---|
| decltype (0) | 2022.03.17 |
| 템플릿의 형식 연역 규칙 (0) | 2022.03.11 |
| 오른값과 왼값 (0) | 2021.11.10 |
| 클래스 생성자 소멸자 호출 순서, 크기 (0) | 2021.11.10 |