프로그래밍/Effective Modern C++(6)
-
[effective modern c++] 항목 6 : auto가 원치 않은 형식으로 연역될 때에는 명시적 형식으로 초기화하자.
개요auto를 사용해서 변수를 선언하면 형식을 명시적으로 지정했을 때보다 기술적으로 여러 강점이 있다.But, 가끔 auto가 이상한 짓을 한다. std::vector features(const Widget& w); 라고 쳤을 때 코드bool highPriority = featrues(w)[5]; processWidget(w, highPriority); 문제점여기서 highPriority의 bool을 auto로 변경하면? processWidget은 미정의 행동이 된다. Why?std::vector에서 std::vector::operator[]가 돌려주는 것은 bool 형이 아니라 std::vector::reference 형식의 객체를 리턴한다.이는 대리자 클래스(proxy class)로 다른 어떤 형식의..
2016.09.10 -
[effective modern c++] 항목 5 : 명시적 형식 선언보다는 auto를 선호하라
요약auto를 잘 활용하면 타이핑 양이 줄어든다.형식을 직접 지정했을 때 겪게 되는 정확성 문제와 성능 문제도 방지할 수 있다.(흠.. 하지만 명시적으로 정의 했을 때 보다 코드 리더블은 떨어지겠지..) auto를 선호하라반복자가 가르키는 것을 표현하기에 명시적으로 선언하기 매우 어렵다.간단한 선언의 즐거움으로 auto를 사용한다. C++14부터는 람다 표현식의 매개변수에도 auto를 사용할 수 있다.123 auto derefUPLess = [](const auto& p1, const auto& p2) { return p1
2016.08.14 -
[effective modern c++] 항목 4: 연역된 형식을 파악하는 방법을 알아두자
기억해 둘 사항들- 컴파일러가 연역하는 형식을 IDE 편집기나 컴파일러 오류 메시지, 부스트 TypeIndex 라이브러리를 이용해서 파악할 수 있다.- 일부 도구의 결과는 유용하지도 않고 정확하지도 않을 수 있다. C++의 형식 연역 규칙들을 제대로 이해하자.
2016.07.16 -
[effective modern c++] 항목 3: decltype의 작동 방식 숙지
decltype주어진 이름이나 표현식의 형식을 알려준다. C++11에서 decltype는 함수의 반환 형식이 그 매개변수 형식들에 의존하는 함수 템플릿을 선언할 때 주로 쓰인다. 너무 이해 안 되서 한 10번은 넘게 읽은 것 같다. 예시로 이해해보기12345 std::deque intDq; intDq.resize(10); authAndAccess(intDq, 5) = 10; std::cout
2016.07.16 -
[effective modern c++] 항목 2 : auto 연역 규칙
핵심- auto 형식 연역은 대체로 템플릿 형식 연역과 같다. 다른 경우는 auto 형신 연역은 중괄호 초기치가std::initializer_list를 나타낸다고 가정하는 반면 템플릿 형식 연역은 그렇지 않다. 타당한 이유는 없다. 그냥 이렇다. 123456auto x = {1,2,3}; // std::initializer_list templatevoid f(T param); f({1,2,3}); // error Colored by Color Scriptercs 두 상황의 연역 규칙이 다르다는 것을 꼭 알아두어야 한다고 한다. - 함수의 반환 형식이나 람다 매개변수에 쓰인 auto에 대해서는 auto 형식 영역이 아니라 템플릿 형식 연역이 적용된다. 1234567891011auto create_init_..
2016.03.01 -
[effective modern C++] 항목 1 : 템플릿 형식 연역 규칙 숙지
auto 키워드는 템플릿에 대한 형식 연역을 기반으로 작동한다. 템플릿은 대게 1 2 3 4 template void f(ParamType param); ... f(expr); cs 이런 형태로 사용되고 호출된다. ParamType은 총 세 가지 경우로 나뉜다. - 포인터 또는 참조 형식이지만 보편 참조(universal reference)는 아님. - 보편 참조.(일단 좌측값 참조나 우측값 참조와는 다르다는 것만 알아둔다.) - 포인터도 아니고 참조도 아님. 경우1. 포인터 또는 참조 형식이지만 보편 참조 아닐 때 연역 과정 - expr이 참조 형식이면 참조 부분을 무시한다. - expr의 형식을 ParamType에 패턴 매칭 시켜 T의 형식을 결정한다. 이건 평소에 자주 사용하는 template 이용..
2016.03.01