에 따르면 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)
.
재 작성된 후보 세트는 다음과 같이 결정됩니다.
- 관계형 ([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
: 내 생각 엔 그것은 평등 사업자 대칭 수없는 경우, 타사 용기와 함께 사용하면 이전 버전과의 호환성을 유지하는 것입니다.
답변
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!=
일부로 제거되었습니다 – 모선이 착륙했습니다 .