Це код із коду видалення зі стандартної бібліотеки C ++.
Неправильно. Це не C ++ стандартної бібліотеки коду. Це одна можлива внутрішня реалізація стандартної функції бібліотеки C ++ . Стандарт C ++ не прописує фактичний код; Це передбачає функціонування прототипів і вимагає поведінки.removeremove
Іншими словами: З суворої мовної точки зору код, який ви бачите , не існує . Це може бути з якогось файла заголовка, який постачається зі стандартною реалізацією бібліотеки вашого компілятора. Зауважте, що стандарт C ++ навіть не вимагає наявності цих заголовкових файлів . Файли - це просто зручний спосіб, щоб виконавці-компілятори відповідали вимогам для такої лінії #include <algorithm>(тобто надання std::removeта доступність інших функцій).
Чому нерівність перевіряється як if (!(*first == val))замість if (*first != val)?
Тому що operator==вимагає лише функція.
Якщо мова йде про перевантаження оператора для користувацьких типів, мова дозволяє робити всі види дивних речей. Ви могли б дуже добре створити клас, який перевантажений, operator==але не перевантажений operator!=. Або ще гірше: ви можете перевантажувати, operator!=але змушувати це робити абсолютно не пов'язані між собою речі.
Розглянемо цей приклад:
#include <algorithm>
#include <vector>
struct Example
{
int i;
Example() : i(0) {}
bool operator==(Example const& other) const
{
return i == other.i;
}
bool operator!=(Example const& other) const
{
return i == 5; // weird, but nothing stops you
// from doing so
}
};
int main()
{
std::vector<Example> v(10);
// ...
auto it = std::remove(v.begin(), v.end(), Example());
// ...
}
Якщо std::removeвикористовувати operator!=, то результат був би зовсім іншим.
operator!=. Просто використовуйтеoperator==реалізацію:bool operator!=(const Foo& other) { return !(*this == other); }