Нужно ли определять `operator ==` для использования моего класса со стандартными контейнерами? - PullRequest
1 голос
/ 19 июля 2010

Я бы хотел пояснить стандарт C ++, особенно там, где говорится (моя интерпретация) в разделе 20.1.3, что «для класса T и экземпляра класса T с именем x, T (x) должен быть эквивалентен x»чтобы класс работал со стандартными контейнерами.

Я не смог найти определение «эквивалент».Означает ли это, что я должен определить operator== как члена моего класса, чтобы T(x) == x вернул true?

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Эквивалент целенаправленно расплывчатый.(Чтобы избежать таких вещей, как подразумевание operator== , необходимо определить ; в общем случае это не так.)

Однако концептуально две вещи эквивалентны, если их данные представляют один и тот же объект.Если у класса есть данные, которые могут отличаться при «копировании», то вам нужно сделать operator== (и, возможно, operator< вместе с rel_ops), чтобы убедиться, что «эквивалент» реализован в отношении этого.(По сути, убедитесь, что изменяемые данные не являются, так сказать, «частью класса».)

Обычно лучше не идти по этому пути, потому что в конечном итоге вам придется исправлять множество вещейчтобы убедиться, что он работает правильно.Если что-то нужно скопировать, пусть, если будет полностью скопировано.Это имеет гораздо больше смысла.

0 голосов
/ 19 июля 2010

Это означает, что класс должен быть копируемым.
И что конструктор копирования создает объект, эквивалентный оригиналу.

Если вы не определите его, компилятор сгенерирует конструктор копирования.
Если в классе нет указателей, это должно работать нормально в большинстве ситуаций.

Примечание: вам не нужно определять 'operator =='

...