본문 바로가기

Effective Modern C++30

auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용 auto가 원치 않는 형식으로 연역되는 예가 있다. std::vector features(const Widget& w); Widget w; bool highPriority = features(w)[5]; processWidget(w, highPriority); 위 코드에서는 정상적으로 작동한다. 하지만 highPriority를 auto로 대체하면 상황은 달라진다. std::vector의 operator[]가 돌려주는 것은 한 요소에 대한 참조가 아니라 std::vector::reference 형식의 객체이다. std::vector::reference가 존재하는 것은, std::vector이 자신의 bool들을 bool당 1비트의 압축된 형태로 표현하도록 명시되어 있기 때문이다. 그렇기 때문에 operat.. 2020. 6. 28.
명시적 형식 선언보다는 auto를 선호하라 C++11 부터는 auto 문법 덕분에 이 문제점들이 모두 사라졌다. auto 변수의 형식은 해당 초기치로부터 연역되므로, 반드시 초기치를 제공해야한다. int x1;// 문맥에 따라서 초기화 되지 않을 수 있음 auto x2;// 오류 : 초기치가 꼭 필요함 auto x3 = 0;// 양호함 : x3의 값이 정의됨 그리고 auto는 형식 연역을 사용하므로 컴파일러에만 있던 형식을 지정할 수 있다. auto derefUPLess = [](const std::unique_ptr& p1,// std::unique_ptr들이 가리키는 Widget const std::unique_ptr& p2)// 객체들을 비교하는 함수 { return *p1 < *p2; }; auto derefLess = [](const a.. 2020. 6. 27.
연역된 형식을 파악하는 방법 IDE 편집기 일반적으로 간단한 형식의 경우에는 IDE가 알려준 정보가 쓸만하다. 컴파일러의 진단 메시지 컴파일러가 연역한 형식을 파악할 때 원하는 형식 때문에 컴파일에 문제가 발생하게 만드는 것이다. const int theAnswer = 42; auto x = theAnswer; auto y = &theAnswer; template class TD; TD xType; TD yType; 컴파일러마다 형태는 다르지만 동일한 정보를 제공하게 된다. 실행시점 출력 std::cout 2020. 6. 26.
decltype의 작동 방식 decltype은 주어진 이름이나 표현식의 형식을 알려준다. 대부분의 경우 decltype은 주어진 이름이나 표현식의 구체적인 형식을 그대로 말해준다. const int i = 0; // decltype(i)는 const int bool f(const Widget& w); // decltype(w)는 const Widget&, decltype(f)는 bool(const Widget&) struct Point { int x, y; // decltype(Point::x) 는 int, decltype(Point::y)는 int }; Widget w; // decltype(w)는 Widget if (f(w)) ... // decltype(f(w))는 bool template // std::vector를 단순화한.. 2020. 6. 26.
auto 형식 연역 규칙 템플릿 형식 연역과 auto 형식 연역 사이에는 직접적인 대응 관계가 존재한다. template void f(ParamType param); f(expr); auto x = 27;// x의 형식 지정자는 auto const auto cs = x;// x의 형식 지정자는 const auto const auto& rx = x;// x의 형식 지정자는 const auto& x와 cx, rx의 형식들을 연역할 때, 컴파일러는 선언마다 템플릿 함수 하나와 해당 초기화 표현식으로 템플릿 함수를 호출하는 구문이 존재하는 것처럼 행동한다. template void func_for_x(T param);// x의 형식을 연역하기위한 개념적인 템플릿 func_for_x(27);// 개념적인 호출 : param에 대해 연역된.. 2020. 6. 24.
템플릿 형식 연역 규칙 auto : 템플릿에 대한 형식 영역을 기반으로 작동 - 기본적인 함수 템플릿의 선언 template void f(ParamType param); f(expr); 이러한 경우, 컴파일 시간에 컴파일러는 expr을 이용해 T에 대한 형식과 ParamType에 대한 2가지 형식을 연역하게 된다. 예를들어 template void f(const T& param);// ParamType 은 const T& int x = 0; f(x); 이 경우 T는 int로 연역되지만 ParamType은 const int&로 연역된다. T에 대해 연역된 형식은 expr의 형식에 의존할 뿐만 아니라 ParamType의 형태에도 의존하게 되며, 총 세가지 종류로 나뉜다. 첫번째, ParamType이 포인터 또는 참조 형식이지만 보.. 2020. 6. 23.