2010-07-19 2 views
1

저는 C++ 표준에 대한 설명을하고 싶습니다. 특히 20.1.3 절에서 "클래스 T와 클래스 T의 인스턴스는 x, T (x)는 x와 같아야합니다"에 대해 (내 해석) 표준 컨테이너로 작업 할 클래스.표준 컨테이너에서 클래스를 사용하려면`operator ==`를 정의해야합니까?

'equivalent'의 정의를 찾을 수 없습니다. 이것은 내 클래스의 멤버로 operator==을 정의해야한다는 것을 의미합니까? T(x) == x이 true를 반환합니다.

+0

표준 문서에 대한 적절한 링크를 주시면 감사하겠습니다. 아무도 알아두면 올바르게 인용 할 수 있습니다 :) – sje397

+0

불행히도 그것은 무료가 아닙니다 : http://stackoverflow.com/questions/81656/where-do- i-find-the-current-c-or-c-standard-documents – GManNickG

답변

1

등가가 의도적으로 모호한 정의 할 필요가 없습니다. (operator==을 피하기 위해서는을 정의해야하며 일반적인 경우는 아닙니다.)

그러나 개념적으로 데이터가 동일한 개체를 나타내는 경우 두 가지가 같습니다. 클래스에 "복사 된"데이터가 다를 수있는 경우 operator== (가능하면 operator<rel_ops)을 만들어 해당 항목과 관련하여 "동급"이 구현되도록해야합니다. (효과적으로, 변경 가능한 데이터가 '클래스의 일부'라는 것을 확인하십시오.)

이렇게 경로를 지정하지 않는 것이 좋습니다. 결국 많은 것을 패치해야하기 때문입니다. 제대로 작동하는지 확인하십시오. 무언가가 베껴지면 완전히 베껴 져야한다. 이것은 훨씬 더 의미가 있습니다.

+0

나는 당신의 정의가 '옳다'(그러므로 받아 들인다)라고 생각한다. 그러나 그것은 매우 이상하게 보였다. (이것은 끔찍하게 읽을 수없는 코드와 당신의 마음을 날려 버릴 수있는 중첩 된 템플릿)은 디자인에 * 개념적 제약을 가하고 있습니다. 예를 들어, 연산자가 내 디자인에 정의되어 있지만 아직 입력하지 않았고 사용되지 않았으므로 어쨌든 최적화 될 수 있습니다. 그러면 '준수'됩니까? – sje397

+0

@sje : ㅎ, 네가 뭘보고 있는지 생각해. :) 나는 그 특별한 경우에 예, *라고 말할 것입니다. 그러나 일반적인 해결책 (그러므로 좋은 충고 : P)을 위해 그것은 이행되어야한다. – GManNickG

+0

또한 표준 컨테이너는 개념으로 정의되며 'value_type'은 특정 개념 세트의 일부 여야합니다. 그래서 예, 그것은 문자 그대로의 의미에서 클래스에 개념적 제한을 가하고 있습니다. – pmr

0

이것은 클래스가 복사 가능해야 함을 의미합니다.
복사 생성자는 원본과 동일한 개체를 만듭니다.

하나를 정의하지 않으면 컴파일러에서 복사 생성자를 생성합니다.
클래스에 포인터가 없으면 대부분의 상황에서 정상적으로 작동합니다.

주 : 'operator =='

+0

그러나 'equivalent'는 정확히 무엇을 의미합니까? – sje397

+0

표준 컨테이너가 개체의 복사본을 만듭니다. (객체를 컨테이너에 복사 함). 당신이 그 안에 복사되는 것이 무엇이든 상관 없다면 동급입니다. 예를 들어 컨테이너에 복사 된 shared_pointer는 원본과 완전히 같지 않을 수 있지만 (일부 내부 상태는 변경 될 수 있음) 원본과 동일합니다. –

+0

컨테이너에 의존하지 않습니까? 두 객체가 같은지 여부를 알 수 없다면 어떻게 해시 테이블이나 바이너리 트리가 작동할까요? – Gabe