CHAPTER 1
EFFECTIVE MODERN C++
김지환

mastrayer@naver.com
CHAPTER 1. 형식 연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto는 한 가지 예외를 제외하고는 템플릿 타입 추론과 동일한 규칙
을 가진다. (item 1의 내용)

auto = 템플릿의 T

타입 지정자 = ParamType 이라고 볼 수 있다.
CHAPTER 1. 형식 연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto x = 27;
const auto cx = x;
const auto& rx = x;
1. x의 타입 지정자는 auto 그 자체이다.

2. cx의 형식 지정자는 const auto이다.

3. rx의 형식 지정자는 const auto&이다.
CHAPTER 1. 형식 연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto x = 27; // case3 - x는 포인터도 참조도 아님
const auto cx = x; // case3
const auto& rx = x; // case1 - rx는 보편참조(universal reference)가 아닌 참조
auto&& uref1 = x; // x: int(lvalue) , uref1: int&
auto&& uref2 = cx; // cx: const int(lvalue) , uref2: const int&
auto&& uref3 = 27; // 27: int(rvalue) , uref3: int&&
// array decays into a pointer
const char name[]
= "R. N. Briggs"; // const char[13]
auto arr1 = name; // const char*
auto& arr2 = name; // const char (&)[13]
void someFunc(int, double);
auto func1 = someFunc; // void (*)(int, double)
auto& func2 = someFunc; // void (&)(int, double)
CHAPTER 1. 형식 연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
27을 초기값으로 하는 int를 선언하는 4가
지 구문이다.







이 구문들을 auto로 사용하면 어떻게 될까?
int x1 = 27; // C++98
int x2(27); // C++98
int x3 = { 27 }; // C++11
int x4{ 27 }; // C++11
CHAPTER 1. 형식 연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto x1 = 27; // int, 27
auto x2(27); // int, 27
auto x3 = { 27 }; // std::initializer_list<int>, { 27 }
auto x4{ 27 }; // std::initializer_list<int>, { 27 }



auto x5 = { 1, 2, 3.0 }; // ERROR!
// std::initializer_list<T>의 T를 타입 추론할 수 없다.
1. 똑같은 결과를 가지는 4가지 스타일의 구문이 auto에선 다른 타입으로 추론되었다.

2. 중괄호 쌍으로 감싸인 형태(C++11 uniform initialization)는 std::initializer_list<T>로 타입 추론된다.
CHAPTER 1. 형식 연역
ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라
auto createInitList() {
return { 1, 2, 3 }; // ERROR!
}
std::vector<int> v;
auto resetV =
[&][const auto& newValue) { v = newValue; }; // C++ 14 lambda
resetV({ 1, 2, 3 }); // ERROR!
1. createInitList의 반환값 {1,2,3}을 타입 추론할 수 없기 때문에 에러가 난다.

2. C++ 14의 람다에서도 마찬가지로 resetV에 넘겨준 {1,2,3}의 타입을 추론할 수 없기 때문에 마찬가지로 에러.

3. 이러한 auto의 용법들은 auto의 타입 추론이 아니라 템플릿 형식 연역의 규칙들이 적용된다.

[Effective Modern C++] Chapter1 - item2

  • 1.
    CHAPTER 1 EFFECTIVE MODERNC++ 김지환
 mastrayer@naver.com
  • 2.
    CHAPTER 1. 형식연역 ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라 auto는 한 가지 예외를 제외하고는 템플릿 타입 추론과 동일한 규칙 을 가진다. (item 1의 내용) auto = 템플릿의 T
 타입 지정자 = ParamType 이라고 볼 수 있다.
  • 3.
    CHAPTER 1. 형식연역 ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라 auto x = 27; const auto cx = x; const auto& rx = x; 1. x의 타입 지정자는 auto 그 자체이다. 2. cx의 형식 지정자는 const auto이다. 3. rx의 형식 지정자는 const auto&이다.
  • 4.
    CHAPTER 1. 형식연역 ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라 auto x = 27; // case3 - x는 포인터도 참조도 아님 const auto cx = x; // case3 const auto& rx = x; // case1 - rx는 보편참조(universal reference)가 아닌 참조 auto&& uref1 = x; // x: int(lvalue) , uref1: int& auto&& uref2 = cx; // cx: const int(lvalue) , uref2: const int& auto&& uref3 = 27; // 27: int(rvalue) , uref3: int&& // array decays into a pointer const char name[] = "R. N. Briggs"; // const char[13] auto arr1 = name; // const char* auto& arr2 = name; // const char (&)[13] void someFunc(int, double); auto func1 = someFunc; // void (*)(int, double) auto& func2 = someFunc; // void (&)(int, double)
  • 5.
    CHAPTER 1. 형식연역 ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라 27을 초기값으로 하는 int를 선언하는 4가 지 구문이다.
 
 
 
 이 구문들을 auto로 사용하면 어떻게 될까? int x1 = 27; // C++98 int x2(27); // C++98 int x3 = { 27 }; // C++11 int x4{ 27 }; // C++11
  • 6.
    CHAPTER 1. 형식연역 ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라 auto x1 = 27; // int, 27 auto x2(27); // int, 27 auto x3 = { 27 }; // std::initializer_list<int>, { 27 } auto x4{ 27 }; // std::initializer_list<int>, { 27 }
 
 auto x5 = { 1, 2, 3.0 }; // ERROR! // std::initializer_list<T>의 T를 타입 추론할 수 없다. 1. 똑같은 결과를 가지는 4가지 스타일의 구문이 auto에선 다른 타입으로 추론되었다. 2. 중괄호 쌍으로 감싸인 형태(C++11 uniform initialization)는 std::initializer_list<T>로 타입 추론된다.
  • 7.
    CHAPTER 1. 형식연역 ITEM 2 : AUTO의 형식 연역 규칙을 숙지하라 auto createInitList() { return { 1, 2, 3 }; // ERROR! } std::vector<int> v; auto resetV = [&][const auto& newValue) { v = newValue; }; // C++ 14 lambda resetV({ 1, 2, 3 }); // ERROR! 1. createInitList의 반환값 {1,2,3}을 타입 추론할 수 없기 때문에 에러가 난다. 2. C++ 14의 람다에서도 마찬가지로 resetV에 넘겨준 {1,2,3}의 타입을 추론할 수 없기 때문에 마찬가지로 에러. 3. 이러한 auto의 용법들은 auto의 타입 추론이 아니라 템플릿 형식 연역의 규칙들이 적용된다.