티스토리 뷰

 

Effective Modern 이펙티브 모던 C++

 

차례

1장. 형식 연역
2장. auto

3장. 현대적 C++ 적응하기
4장. 스마트 포인터
5장. 오른값 참조, 이동 의미론, 완벽 전달
6장. 람다 표현식
7장. 동시성 API
8장. 다듬기 

 

Item 3: decltype의 작동 방식을 숙지하라

기억해 둘 사항들

- decltype은 항상 변수나 표현식의 형식을 아무 수정 없이 보고한다.
- decltype은 형식이 T이고 이름이 아닌 왼값 표현식에 대해서는 항상 T& 형식을 보고한다.
- C++14는 decltype(auto)를 지원한다. decltype(auto)는 auto처럼 초기치로부터 형식을 연역하지만, 그 형식 연역 과정에서 decltype의 규칙들을 적용한다.

 

 

 

 

Item 4: 연역된 형식을 파악하는 방을 알아두라

기억해 둘 사항들

- 컴파일러가 연역하는 형식을 IDE 편집기나 컴파일러 오류 메시지, Boost TypeIndex 라이브러리를 이용해서 파악할 수 있는 경우가 많다.
- 일부 도구의 결과는 유용하지도 않고 정확하지도 않을 수 있으므로, C++의 형식 연역 규칙들을 제대로 이해하는 것은 여전히 필요한 일이다.

 

Item 5: 명시적 형식 선언보다는 auto를 선호하라

일반적으로 std::function 접근방식은 auto 접근방식보다 메모리와 시간을 더 많이 소비하며, 때에 따라서는 메모리 부족(out-of-memory) 예외를 유발할 수도 있다.

auto의 장점이 변수 초기화 누락을 방지하고 장황한 변수 선언을 피하는 것, 그리고 클로저를 직접 담는 것에서 그치는 것은 아니다. 또 다른 장점은 "형식 단축(type shortcut)"이라고 부르는 것과 관련된 문제를 피할 수 있다는 것이다.

사실 형식을 명시적으로 표기하는 것은 그냥 정확성 또는 효율성(또는 둘 다)면에서 미묘한 실수의 여지가 될 뿐, 별다른 득이 없다. 더 나아가서, auto 형식들은 초기화 표현식의 형식이 변하면 자동으로 변한다. 이는 auto를 사용하면 리팩토링이 어느 정도 수월해짐을 의미한다.

기억해 둘 사항들

- auto 변수는 반드시 초기화해야 하며, 이식성 또는 효율성 문제를 유발할 수 있는 형식 불일치가 발생하는 경우가 거의 없으며, 대체로 변수의 형식을 명시적으로 지정할 때보다 타자량도 더 적다.
- auto 형식을 지정한 변수는 Item 2와 Item 6에서 설명한 문제점들을 겪을 수 있다.

 

Item 6: auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라

대리자 클래스(Proxy Class)
실제 클래스를 대신해서 일하는 클래스
- std::vector<bool>::reference 처럼 operatoer[] 연산 시 참조되는 bit를 대신하기 위해 사용
- STL에서 스마트포인터도 raw pointer를 관리하기 위한 대리자 클래스

다음과 같은 형태의 코드는 피해야 한다.
auto someVar = "보이지 않는" 대리자 클래스 형식의 표현식;

기억해 둘 사항들

- "보이지 않는" 대리자 형식 때문에 auto가 초기화 표현식의 형식을 "잘못" 연역할 수 있다.
- 형식 명시 초기치 관용구는 auto가 원하는 형식을 연역하도록 강제한다.

 

 

참고

샘플 코드 https://github.com/BartVandewoestyne/Effective-Modern-Cpp

 

- James Song

댓글