signature decision
연산자 시그니처는 “원본을 바꾸는가”에서 갈라진다
같은 operator 문법이라도 읽기 전용, 상태 변경, 증감, 이동 대입은
반환 타입과
const, noexcept 선택이 다르다.
원본
보존하는가, 변경하는가
반환
값인가, 자기 참조인가
예외
noexcept 약속이 가능한가
연산자 종류별 기본 선택
읽기 전용
operator+, operator==
현재 객체를 바꾸지 않으므로 멤버 함수 끝에 const를
붙인다.
새 결과가 필요하면 값으로 반환한다.
상태 변경
operator+=, operator=
왼쪽 객체가 바뀐다. 연쇄 사용을 위해 보통 자기 자신 참조를
반환한다.
const 멤버 함수가 될 수 없다.
증감
++obj, obj++
전위는 바뀐 자신을 참조로 반환한다.
후위는 이전 값을 보존한 복사본을 반환한다.
자원 이동
operator=(T&&)
이동 대입은 가능하면 noexcept로 선언한다.
컨테이너가 더 안전하게 재배치 최적화를 선택할 수 있다.
반환 타입과 한정자는 관례를 따르면 읽는 비용이 줄어든다
| 연산 | 대표 시그니처 | 반환 의미 | 주의 지점 |
|---|---|---|---|
| 새 값 생성 | T operator+(const T& rhs) const |
원본을 보존하고 결과 객체를 만든다. | 불필요한 복사를 줄이되 의미를 먼저 맞춘다. |
| 누적 변경 | T& operator+=(const T& rhs) |
현재 객체를 바꾼 뒤 자기 자신을 돌려준다. | a += b += c 같은 연쇄 사용을 고려한다. |
| 비교 |
bool operator==(const T& rhs) const noexcept
|
상태를 읽어서 참거짓만 돌려준다. | 예외가 없다면 noexcept가 자연스럽다. |
| 이동 대입 | T& operator=(T&& rhs) noexcept |
자원을 넘겨받고 자기 참조를 반환한다. | 자기 대입, 기존 자원 정리, 원본의 유효 상태를 확인한다. |