C ++ 20에서는 특히 우주선 <=>
연산자 의 도입으로 관계 연산자의 작동 방식이 변경되었습니다 . 특히,을 제공 operator==
하면로 a != b
다시 작성됩니다 !(a == b)
.
에서 [over.match.oper] /3.4 :
재 작성된 후보 세트는 다음과 같이 결정됩니다.
- 관계형 ([expr.rel]) 연산자의 경우, 재 작성된 후보에는 표현식 x <=> y에 대한 재기록되지 않은 모든 후보가 포함됩니다.
- 관계형 ([expr.rel]) 및 3 방향 비교 ([expr.spaceship]) 연산자의 경우, 재 작성된 후보에는 두 개의 매개 변수의 순서가 반대 인 합성 된 후보도 포함됩니다. 식 y <=> x.
- ! = 연산자 ([expr.eq])의 경우, 재 작성된 후보에는 표현식 x == y에 대한 재기록되지 않은 모든 후보가 포함됩니다.
- 등식 연산자의 경우, 재기록 된 후보는 또한 표현 y == x에 대한 각각의 재기록되지 않은 후보에 대해 2 개의 파라미터의 순서가 역전 된 합성 후보를 포함한다.
- 다른 모든 연산자의 경우 재 작성된 후보 세트가 비어 있습니다.
그리고 [over.match.oper] / 9 :
재 작성된 operator == 후보가 연산자 @에 대한 과부하 해결에 의해 선택되면, 리턴 유형은 cv bool이되고 x @ y는 다음과 같이 해석됩니다.
- @가! =이고 선택한 후보가 역순으로 매개 변수! (y == x) 인 합성 후보 인 경우,
- 그렇지 않으면 @가! =,! (x == y) 인 경우
- 그렇지 않으면 (@가 == 인 경우), y == x,
각각의 경우 선택된 재 작성 연산자 == 후보를 사용합니다.
따라서 명시적인 과부하 operator!=
가 더 이상 필요하지 않습니다. 연산자를 제거해도 비교 시맨틱은 변경되지 않았습니다.
operator!=
내가 알 수 있는 한 모든 컨테이너는 제거되었습니다 (예 : 벡터 시놉시스 확인 ). 유일한 예외는 컨테이너 어댑터입니다 std::queue
과 std::stack
: 내 생각 엔 그것은 평등 사업자 대칭 수없는 경우, 타사 용기와 함께 사용하면 이전 버전과의 호환성을 유지하는 것입니다.