1 분 소요

auto 타입 추론 규칙

  • auto의 타입 추론은 한가지 예외를 빼면 템플릿 타입 추론 규칙이 auto의 타입 추론 규칙이다.
template<typename T>
void f(ParamType param);	// ParamType 은 매개변수 param의 타입

f(expr);			// expr 은 인수의 타입을 결정한다.
  • f를 호출할 때 컴파일러는 expr을 이용해서 T의 형식과 ParamType의 형식을 추론한다.
  • auto 를 이용해서 변수를 선언 할 때 auto는 템플릿의 T와 동일한 역할을 하고, 변수의 형식 지정자가 ParamType의 역할을 한다.
auto x = 27;		// auto는 T
const auto cx = x;	// const auto 는 const T 와 같은 매개변수 타입 ParamType
const auto& rx = x;	// const auto& 는 const T& 와 같은 매개변수 타입 ParamType
  • auto 는 uniform initialization 에서 의미가 달라진다.
// 모두 27 을 값으로 가지는 int
int x1 = 27;
int x2(27);
int x3 = { 27 };
int x4{ 27 };
auto x1 = 27;		// int x1 = 27;
auto x2(27);		// int x2(27);
auto x3 = { 27 };	// std::initializer_list<int> x3 = { 27 };
auto x4{ 27 };		// std::initializer_list<int> x4{ 27 }; c++11, c++14까지.. 이후에는 int x4{ 27 };
  • 템플릿은 uniform initialization 을 추론하지 못한다.
auto x = { 11, 23, 9 };	// std::initializer_list<int> x = { 11, 23, 9 };
 
template<typename T>
void f(T param);
 
f({ 11, 23, 9 });		// T를 추론할 수 없음. 오류
  • C++14 에서는 반환 타입을 auto로 지정해서 컴파일러가 추론할 수 있다.
  • C++14 에서는 람다의 매개변수 선언에 auto를 사용할 수 있다.
  • C++14 에서의 반환 타입 auto 와 람다의 매개변수 선언 auto는 템플릿 추론 규칙이 적용된다.
auto create_init_list()
{
	return { 1, 2, 3 };	// 템플릿 추론 규칙으로 추론 실패.
}

std::vector<int> v;

auto reset_v = [&v](const auto& new_value) { v = new_value; };	// C++14

reset_v({ 1, 2, 3 });

댓글남기기