EMC++ 소개 부분
lvalue, rvalue
- 주소를 취할 수 있으면 lvalue, 아니면 rvalue
- 매개변수 자체는 lvalue (
Widget&& rhs
에서, 타입은 rvalue 참조, rhs 자체는 lvalue)
잘 설계된 함수
- 예외에 안전: 기본 보장: 불변식 위반 x
- 강한 보장 함수를 호출할 때에는 예외가 발생해도 프로그램의 상태가 호출 이전 상태와 동일하게 유지될 것
Type Deduction
- C++98 : 템플릿에 대한 것 만 있었음
C++11 : 새로운 규칙 집합 두개
- auto를 위한 규칙
- decltype을 위한 규칙
- C++14 : auto, decltype을 사용할 수 있는 문맥이 확장
항목1~4: 생략
항목1: 템플릿 타입 연역 규칙
항목2: auto의 타입 연역 규칙
- auto는
auto a = {1, 2, 3}
에서 타입을std::initializer_list
로 해석 - Template는 그렇지 않음
- 리턴 타입이 auto일 경우 Template 타입 연역이 적용됨
- auto는
항목3: decltype의 작동방식
항목4: 연역된 형식을 파악하는 방법
항목5: auto 사용
auto 의 장점
- 변수 초기화 누락 방지
- 장황한 변수 선언 회피
- 클로저를 직접 저장
- 리팩터링하기 쉬워짐
- type shortcut 관련 문제 회피
- 64비트, 32비트 호환성 관련(unsigned 와 vector
::size_type 의 바이트 크기)
- 64비트, 32비트 호환성 관련(unsigned 와 vector
- 기대하지 않은 암묵적 변환 회피
- auto 의 단점
- 초기화 표현식의 타입이 기대하지 않은 것일 경우가 있음
- 항목2, 항목6 참고
- 코드의 가독성 저하
- 초기화 표현식의 타입이 기대하지 않은 것일 경우가 있음
auto 선언된 클로저는 더 효율적
그 클로저에 요구되는 만큼의 메모리만 사용
클로저를 담는 std::function의 단점
- std::function 템플릿의 한 인스턴스가 타입
- 그 크기는 고정됨.
- 요구된 클로저의 크기보다 작을 수 있고
- 이 경우 힙 메모리를 할당해서 클로저를 저장
- auto 보다 메모리 더 많이 소비
- 인라인화를 제한, 간접 함수 호출을 산출하는 구현 세부사항 —> auto 접근방식보다 느림
- 메모리 부족 예외 가능성이 있음
기억해 둘 사항
- auto 는 반드시 초기화
- auto는 이식성 or 효율성 문제를 유발할 수 있는 타입 불일치가 발생하는 경우가 거의 없음
- 항목2와 항목6에 대해 주의해야함
항목6: auto… 원치 않은 타입으로 연역될 때 명시적 타입의 초기치 사용
auto var = "보이지 않는" 대리자 클래스 형식의 표현식
은 피해야함- 인터페이스를 세심하게 살펴봐야함.
- auto가 다른 형식을 연역하도록 강제 -> explicitly typed initializer idiom
타입 명시 초기치 관용구(explicitly typed initializer idiom)
auto sum = static_cast<bool>(features(w)[5]);
- 의도 표현이 명확해짐 (암묵적 타입 변환보다)
ex) vector bool
1
2
std::vector<bool> features(const Widget& w);
auto highPriority = features(w)[5];
위에서 auto는 bool 이 아님: std::vector의 문제 </span> </summary>std::vector<bool>
- 부울당 1비트의 압축된 형태로 표현하도록 명시되어있음
- C++에서는 비트에 대한 참조는 금지되어 있어 bool& 을 리턴할 수 없음
- 그래서 operator[]는
std::vector<bool>::reference
형식을 리턴함
std::vector<bool>::reference
- 구현방식에 따라 동작이 다름
- UB
- dangling pointer의 가능성
- 위에서 highPriority는
std::vector<bool>::reference
의 복사본 - highPriority는 포인터와 5번 비트의 오프셋을 담게됨
- 이는 임시 객체이므로, 문장의 끝에서 소멸
</details> Proxy class
- 다른 타입의 행동을 흉내 및 보강
- ex) 스마트 포인터과 포인터 (명백히 보이는 클래스),
::reference 과 std::bitset - expression template 기법
- 암묵적 변환 지원…
- Sum<Matrix, Matrix> … 를 사용하면 더 효율적으로 표현식 계산??
- 보이지 않는 대리자 클래스는 auto와 맞지 않음
</div> </details> ## **출처** emc++ 1~52p
std::vector<bool>
- 부울당 1비트의 압축된 형태로 표현하도록 명시되어있음
- C++에서는 비트에 대한 참조는 금지되어 있어 bool& 을 리턴할 수 없음
- 그래서 operator[]는
std::vector<bool>::reference
형식을 리턴함
std::vector<bool>::reference
- 구현방식에 따라 동작이 다름
- UB
- dangling pointer의 가능성
- 위에서 highPriority는
std::vector<bool>::reference
의 복사본 - highPriority는 포인터와 5번 비트의 오프셋을 담게됨
- 이는 임시 객체이므로, 문장의 끝에서 소멸
- 위에서 highPriority는
Proxy class
- 다른 타입의 행동을 흉내 및 보강
- ex) 스마트 포인터과 포인터 (명백히 보이는 클래스),
::reference 과 std::bitset - expression template 기법
- 암묵적 변환 지원…
- Sum<Matrix, Matrix> … 를 사용하면 더 효율적으로 표현식 계산??
- 보이지 않는 대리자 클래스는 auto와 맞지 않음