Это код из стандартной библиотеки удаления кода 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); }