728x90
형식언어
항목 2 : auto의 형식 연역 규칙을 숙지하라
항목 1과 거의 동일하다. ( auto를 ParamType으로 대체하여 생각하면 된다. )
- 형식 지정자가 포인터나 참조형식이지만 보편 참조는 아닌 경우
- 형식 지정자가 보편 참조인 경우
- 형식 지정자가 포인터도 아니고 참조도 아닌 경우
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
'Language > effective modern C++' 카테고리의 다른 글
Effective modern C++ ( Auto ) (0) | 2021.10.16 |
---|---|
Effective modern C++ ( Auto ) (0) | 2021.10.16 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.10.14 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.09.26 |
Effective modern C++ ( 형식 언어 ) (0) | 2021.09.21 |
댓글