Programing

C ++에서 operator ==를 양방향으로 오버로드해야합니까?

lottogame 2021. 1. 8. 07:46
반응형

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 ++는 편을 잡고 서로 다른 유형의 두 객체를 비교하면 순서에 따라 두 개의 다른 비교 연산자가 호출됩니다.

물론 일관되고 놀라운 것이 아니기를 원하므로 두 번째는 첫 번째 측면에서 정의되어야합니다.

참조 URL : https://stackoverflow.com/questions/53300142/in-c-do-you-need-to-overload-operator-in-both-directions

반응형