Загадка:
Почему 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