C ++에서 operator ==를 양방향으로 오버로드해야합니까?
수업에서 일하고 있다고 가정 해 보겠습니다.
class Foo{
public:
std:string name;
/*...*/
}/*end Foo*/
그리고 나는 과부하를 제공합니다 operator==
bool operator==(const Foo& fooObj, const std::string& strObj) {
return (fooObj.name == strObj);
}
동일한 논리를 반대로 다시 구현해야합니까?
bool operator==(const std::string& strObj, const Foo& fooObj) {
return (strObj == fooObj.name);
}
(C ++ 20 이상)
p1185 를 C ++ 20에 수용하면 둘 이상의 오버로드를 제공 할 필요가 없습니다. 이 문서는 표준을 다음과 같이 변경했습니다.
[over.match.oper]
3.4 -[...]
!=
연산자 ([expr.eq])의 경우, 재 작성된 후보에는 컨텍스트 변환시==
재 작성된 표현식(x == y)
이 올바른 형식 인 연산자에 대한 모든 멤버, 비 멤버 및 내장 후보 가 포함됩니다. 그 연산자를 사용하는 bool==
. 동등 연산자의 경우 재 작성된 후보에는 각 멤버에 대해 두 매개 변수의 순서가 반대로 된 합성 후보도 포함됩니다. 즉, 컨텍스트==
에서 재 작성된 표현식(y == x)
이 올바른 형식 인 연산자에 대한 기본 제공 후보, 비 멤버 및 기본 제공 후보입니다. 해당 연산자를 사용하여 bool로 변환==
. [참고 : 멤버 후보에서 합성 된 후보는 두 번째 매개 변수로 암시 적 객체 매개 변수가 있으므로 첫 번째 매개 변수에 대해서는 암시 적 변환이 고려되지만 두 번째 매개 변수에는 고려되지 않습니다. — 끝 노트] [...]8 [...]
!=
연산자에 대한 과부하 해결에 의해 재 작성된 후보가 선택 되면 선택한 후보가 매개 변수의 순서가 반대 인 합성 후보 인 것처럼x != y
해석(y == x) ? false : true
되거나(x == y) ? false : true
그렇지 않으면 선택한 재 작성된operator==
후보를 사용하는 것으로 해석됩니다 . 재 작성된 후보가==
연산자에 대한 과부하 해결에 의해 선택되면 선택한 재 작성된 후보x == y
를(y == x) ? true : false
사용하는 것으로 해석됩니다operator==
.
은하지 유일한 수단보다 당신이 하지 , 당신은 또한 얻을 반전 피연산자의 순서로 연산자를 제공 할 필요가 !=
무료! 또한 operator==
함수는 의미가있는 경우 멤버가 될 수 있습니다. 위의 첫 번째 단락에서 언급했듯이 멤버 또는 자유 함수는 암시 적 변환에 영향을 미치므로 여전히 염두에 두어야합니다.
(C ++ 17까지)
문자열이 왼쪽 Foo
에 있고 오른쪽에있는 비교를 지원하려면 수행합니다 . 구현은 operator==
작동하도록 오버로드 된 인수의 순서를 변경하지 않습니다 .
하지만 구현 논리를 반복하지 않아도됩니다. 운영자가 예상대로 동작해야한다고 가정합니다.
inline bool operator==(const std::string& objA, const Foo& objB) {
return objB == objA; // Reuse previously defined operator
}
네, 그렇습니다. 다른 많은 언어에서와 마찬가지로 C ++는 편을 잡고 서로 다른 유형의 두 객체를 비교하면 순서에 따라 두 개의 다른 비교 연산자가 호출됩니다.
물론 일관되고 놀라운 것이 아니기를 원하므로 두 번째는 첫 번째 측면에서 정의되어야합니다.
'Programing' 카테고리의 다른 글
리소스로드 실패 : 서버가 404 (찾을 수 없음) 상태로 응답했습니다. (0) | 2021.01.08 |
---|---|
AngularJS $ http 성공 / 오류 메서드가 더 이상 사용되지 않는 이유는 무엇입니까? (0) | 2021.01.08 |
“svn update -r”에 해당하는 git은 무엇입니까? (0) | 2021.01.08 |
boost :: shared_ptr이있는 NULL 포인터? (0) | 2021.01.08 |
학습 알고리즘 및 데이터 구조 기초 (0) | 2021.01.08 |