본문 바로가기
Language/effective modern C++

Effective modern C++ ( 형식 언어 )

by y.j 2021. 9. 22.
728x90

형식언어

항목 2 : auto의 형식 연역 규칙을 숙지하라
항목 1과 거의 동일하다. ( auto를 ParamType으로 대체하여 생각하면 된다. )

  1. 형식 지정자가 포인터나 참조형식이지만 보편 참조는 아닌 경우
  2. 형식 지정자가 보편 참조인 경우
  3. 형식 지정자가 포인터도 아니고 참조도 아닌 경우
 auto x = 27;                   // 경우 3 ( x는 포인터도 아니고 참조도 아님 )
 const auto cx = x;             // 경우 3 ( cx 역시 둘 다 아님 )
 const auto& rx = x;            // 경우 1 ( rx는 보편 참조가 아닌 참조 )

 auto&& uref1 = x;              // x는 int이자 l-value이므로
                                // uref1의 형식은 int&

 auto&& uref2 = cx;             // cx는 const int이자 l-value
                                // uref2의 형식은 const int&

 auto&& uref3 = 27;             // 27은 int이자 r-value
                                // uref3의 형식은 int&&

붕괴 방식 : auto에서도 똑같이 나타난다.

 const char name[] = "R. N. Briggs";       // name의 형식은 const char[13]

 auto arr1 = name;                         // arr1의 형식은 const char*

 auto arr2 = name;                         // arr2의 형식은
                                           // const char (&)[13]

 void someFunc(int, double);               // someFunc는 함수;

 auto func1 = somFunc;                     // func1의 형식은 void (*)(int, double)

 auto func2 = sumeFunc;                    // func2의 형식은 void (&)(int, double)

변수를 생성하는 구문 : 배열은 std::initializer_list에 연역되기 된다.

auto x1 = 27;        // 형식은 int, 값은 27

auto x2(27);         // 마찬가지

auto x3 = { 27 };    // 형식은 std::initializer_list<int>,
                     // 값은 { 27 }

auto x4{ 27 };       // 마찬가지 

auto x5 = { 1, 2, 3.0 }; // T를 연역할 수 없음


template<typename T>
void f(T param);

f({ 11, 23, 9 });          // 오류! T에 대해서 연역 할 수 없음

template<typename T>
void f(std::initializer_list<T> initList);

f({ 11, 23, 9 });          // std::initializer_list<int>로 연역


auto createInitList() 
{
  return { 1, 2, 3 };
}                           // 오류

728x90

댓글