Оператор проверки равенства в классах строк

Я заметил, что многие классы строк в C++ не реализуют оператор == для сравнения со строками. В чем причина этого? Насколько я понимаю, реализация класса для строки должна сделать строку самой по себе сущностью, а не указателем на набор символов. Таким образом, мы определенно должны ожидать, что оператор == будет реализован для сравнения значений двух сущностей (то есть строк)!


person Rafid    schedule 28.01.2011    source источник
comment
Можете ли вы привести пример того, что не так? std::string делает, например.   -  person Jeff Foster    schedule 28.01.2011
comment
Хммм... вы уверены насчет std::string?! Я только что проверил реализацию std::string (реализация MSVC), и она не содержит никакой реализации для ==.   -  person Rafid    schedule 28.01.2011
comment
Я думал, что основная причина отказа от его реализации заключается в том, чтобы избежать переопределения поведения по умолчанию ==, которое должно сравнивать очень низкий уровень значений, а не то, что они представляют (т.е. указатель против содержимого).   -  person Rafid    schedule 28.01.2011
comment
См. sgi.com/tech/stl/basic_string.html. std::string абсолютно точно реализует ==.   -  person Jeff Foster    schedule 28.01.2011
comment
операторы сравнения для std::string находятся здесь cplusplus.com/reference/string/operators   -  person Nim    schedule 28.01.2011


Ответы (3)


Часто, когда класс не реализует operator==, это происходит потому, что вне класса есть свободная функция. Преимущество бесплатной функции operator== заключается в том, что она поддерживает неявные преобразования с обеих сторон. Это особенно важно для строк, потому что там часто используются литералы const char[] и требуется неявное преобразование. Например.

MyString S("Hello");
if ("hello" == S) { // Can't use MyString::operator== here
  std::cout << S;
}
person MSalters    schedule 28.01.2011
comment
Я считаю, что это лучший ответ. Спасибо! - person Rafid; 28.01.2011

std::string — это basic_string, и у него есть оператор ==, который использует метод сравнения char_traits.

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

person CashCow    schedule 28.01.2011

Причиной отказа от реализации оператора == для строкового класса может быть то, что вы считаете, что существует больше способов сравнения строк: с учетом регистра/нечувствительным, игнорирование диакритических знаков... и вы предоставляете различные функции сравнения, чтобы пользователь мог указать.

Это все еще выбор, и, как уже прокомментировал Джефф Фостер: он реализован в единственной реальной строке на С++ (std::string)

person stefaanv    schedule 28.01.2011
comment
Вот почему он делегирует класс свойств для сравнения. Вы можете получить сравнение без учета регистра, используя класс признаков, который сравнивает таким образом. - person CashCow; 28.01.2011
comment
@CashCow: есть ссылки на это? Во всяком случае, я показывал выбор дизайна при реализации еще одной строки. - person stefaanv; 28.01.2011
comment
здесь, при переполнении стека stackoverflow.com/questions/ 11635/ - person CashCow; 28.01.2011