많은 표준 라이브러리 유형의 C ++ 20에서 operator! =가 제거 된 이유는 무엇입니까? 무의미 할 것입니다. 마찬가지로, operator!=예컨대

에 따르면 cppreference , std::type_info::operator!=C ++ (20)로 제거됩니다, 그러나, std::type_info::operator==분명히 남아있다.

뒤에 추론은 무엇입니까? 나는 불평등을 무의미하게 비교하는 데 동의하지만 평등을 비교하는 것은 무의미 할 것입니다.

마찬가지로, operator!=예컨대 용기를 포함하는 많은 다른 표준 라이브러리 유형의 std::unordered_map::operator!=std::unordered_set::operator!=cppreference에 따른 C ++ 20에서 제거 될 것이다.

작성 if(!(id1 == id2))해야하는 if(id1 != id2)것은 대조적으로 반대로 코드를 명확하게하지 않습니다 …



답변

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::queuestd::stack: 내 생각 엔 그것은 평등 사업자 대칭 수없는 경우, 타사 용기와 함께 사용하면 이전 버전과의 호환성을 유지하는 것입니다.


답변

operator!=더 이상 제공된 라이브러리가 필요하지 않습니다 . 제공하는 operator==컴파일러를 허용하는 것은 일부 저글링을하고 평가하는 a != b측면에서 a == b모든 자체.

[over.match.oper]

3 cv-unqualified 버전이 T1 인 유형의 피연산자가있는 단항 연산자 @의 경우 cv-unqualified 버전이 T1 인 유형의 왼쪽 피연산자가있는 이항 연산자 @의 경우 cv- 규정되지 않은 버전은 T2이며, 4 개의 후보 함수 세트, 지정된 멤버 후보, 비 멤버 후보, 내장 후보 및 재 작성 후보는 다음과 같이 구성됩니다.

3.4.3 ! = 연산자 ([expr.eq])의 경우, 재 작성된 후보에는 표현식 x == y에 대한 재기록되지 않은 모든 후보가 포함됩니다.

std::type_info그리고 더 많은 도서관 유형이 P1614의operator!= 일부로 제거되었습니다 – 모선이 착륙했습니다 .