* 정의

 

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

+ Recent posts