«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему в `std::function` отсутствует сравнение равенства?

Почему в `std::function` отсутствует сравнение равенства?

Опубликовано 2 ноября 2024 г.
Просматривать:952

Why Does `std::function` Lack Equality Comparison?

Разгадка загадки равенства std::function

Загадка:

Почему std::function, неотъемлемый компонент современных кодовых баз C, не наделенный возможностями сравнения на равенство? Этот вопрос озадачивал программистов с момента его возникновения, приводя к путанице и трудностям в управлении коллекциями вызываемых объектов.

Ранняя неоднозначность:

В раннем проекте C 11, перегрузки для операторов == и оператора!= были объявлены, но удалены, оставив пустоту, которая так и не была должным образом объяснена. Сопровождающий комментарий «закрыть возможную дыру в системе типов» намекал на скрытый недостаток, но его природа оставалась загадкой.

Лазейка и защита:

Предполагаемая «лазейка» связана с наличием булевой функции преобразования. При отсутствии явных операторов сравнения на равенство эта функция может допускать неявные сравнения через == или !=. Однако эта лазейка может привести к неожиданному поведению, о чем свидетельствует:

struct S {
    operator bool() { return false; }
};

int main() {
    S a, b;
    bool are_equal(a == b); // Uses operator bool on a and b!
}

C 03 представил идиому Safe-Bool, а C 11 реализовал явную функцию преобразования bool, чтобы предотвратить эту лазейку.

Контраст с std::shared_ptr:

В отличие от std::function, std::shared_ptr имеет четко определенную семантику равенства. Два указателя равны, если они оба пусты или оба непусты и указывают на один и тот же объект. Это четкое определение позволило реализовать операторы сравнения на равенство в std::shared_ptr.

Разгаданная загадка:

Обоснование того, почему невозможно сделать сравнение равенства std::function вытекает из неотъемлемой проблемы определения значимого критерия равенства для произвольных вызываемых типов. Если это будет реализовано, это станет бременем для всех разработчиков функциональных объектов и все равно может привести к неоднозначным сравнениям из-за различий в аргументах привязки. Более того, отсутствие операторов равенства эффективно закрывает лазейку, возникающую в результате неявных преобразований.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3