본문 바로가기

Language/effective modern C++7

현대적 C++에 적응하기 현대적 C++에 적응하기 항목 7 : 객체 생성 시 괄호와 중괄호를 구분하라 변수를 선언한 방법은 크게 3가지이다. int x(0); int y = 0; int z{0}; 균일 초기화(uniform initialization) C++11은 위에서 처럼 중괄호({..})로 초기화 할 수 있는 방법이 있다. 멤버의 초기 값을 지정하는 데에도 사용 할 수 있다. class Widget { private : int x{0}; int y = 0; int z(0); // 오류 } 복사 할 수 없는 객체를 초기화 할 수 있다. std::atomic ai1{ 0 }; std::atomic ai2( 0 ); std::atomic ai3 = 0; // 오류 암묵적 좁히기(narrowing conversion) 변환을 방지.. 2021. 10. 17.
Effective modern C++ ( Auto ) Auto 항목 6 : auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라. 컨테이너를 참조하는 operation[]은 보통 &T를 돌려주지만 bool의 경우는 다르다. 왜냐하면 C++에서는 bool처럼 bit에 대한 형식에 대해서 참조하는 것이 금지되어 있다. std::vector features(const Widget& w); Widget w; auto highPriority = features(w)[5]; // 임시객체 vector 파괴된다. processWidget(w, highPriority); 위 코드를 보았을 때 bool일 경우 이야기 해보자! 1. features는 처음에 임시객체 vector을 return한다. 2. 임시객체 vector의 5번 객체를 찾아서 std.. 2021. 10. 16.
Effective modern C++ ( Auto ) Auto 항목 5 : 명시적 형식 선언보다는 auto를 선호하라 Auto를 사용하지 않을 때 불편한 점 1. 초기화 하지 않을 때, 쓰레기 값이 들어갈지 초기 값(0 or "")이 들어갈지 모른다. 2. 긴 형식을 짧게 만들 수 있다. ( ex typename std::iterator_traits::value_type ) 3. closure형식으로 지역변수를 선언 할 때, 타입을 명시하는 것이 어렵다. auto를 사용 할 때 무조건 초기 값을 넣어야 한다. 컴파일러가 auto를 연역하려면 초기값이 필요하므로 초기 값을 넣지 않은 실수를 방지 할 수 있다. int x1; // 문맥에 따라서는 초기화되지 않을 수 있음 auto x2; // 오류! 초기치가 꼭 필요함 auto x3 = 0; // 양호함; x3.. 2021. 10. 16.
Effective modern C++ ( 형식 언어 ) 형식언어 항목 4: 연역된 형식을 파악하는 방법을 알아두라 IDE편집기 마우스 커서를 올려 놓으면 연역을 확인해 준다. 컴파일러 진단 메시지 원하는 형식에 컴파일러 에러 문제가 발생하게 만드는 것이다. template class TD; auto x = theAnswer; auto y = &theAnswer; TD xType; TD yType; error: aggreate 'TD xType' has incomplete type and cannot be defined. error: aggreate 'TD yType' has incomplete type and cannot be defined. 실행시점 출력 2021. 10. 14.
Effective modern C++ ( 형식 언어 ) 항목 3 : decltype의 작동 방식을 숙지하라 auto, decltype은 operator[]에 따라 다른 값을 돌려 줄 수 있다. ( 왜 그런지는 항목 6에서 확인 ) Widget w; auto myWidget1& cw = w; auto myWidget1 = cw; // auto의 형식 연역 : // myWidget1의 형식 Widget decltype(auto) myWidget2 = cw; // decltype 형식 연역 : // const Widget& 그렇다면 이 2개를 어떻게 맞출 수 있을까? C++11 : 후행 반환 형식(trailing return type)을 통해 auto의 타입형식을 decltype과 일치 시킬 수 있다. // 아래 코드는 정련 할 필요가 있다. template au.. 2021. 9. 26.
Effective modern C++ ( 형식 언어 ) 형식언어 항목 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이자 .. 2021. 9. 22.
Effective modern C++ ( 형식 언어 ) 형식 연역 항목 1: 템플릿 형식 연역 규칙을 숙지하라 필요성 : 템플릿 형식 연역 규칙들이 auto의 문액에 적용 될 때 덜 직관적임 auto를 잘 활용하려면 템플릿 형식 연역을 이해하고 있어야 한다. T, ParamType서로 다르게 연역된다. template void f(ParamType param) f(expr) *위의 식은 아래에서 parameter를 말하기 위해서 사용한다. 보편 참조(universal reference)가 아닌 경우 ( 포인터 or 참조 형식 ) 만일 expr이 참조 형식이면 참조 부분을 무시 expr의 형식을 ParamType에 대해 패턴 부합(pattern-matching)방식으로 대응시켜 T의형식을 결정 template void f(T& param); int x = 27.. 2021. 9. 21.