El enigma:
¿Por qué std::function, ¿Un componente integral de las bases de código C modernas, que no está dotado de capacidades de comparación de igualdad? Esta pregunta ha dejado perplejos a los programadores desde sus inicios, generando confusión y dificultades en la gestión de colecciones de objetos invocables.
La ambigüedad inicial:
En un borrador inicial de C 11, se declararon sobrecargas para operator== y operator!=, pero se eliminaron, dejando un vacío que nunca se explicó adecuadamente. El comentario adjunto "cerrar un posible agujero en el sistema tipográfico" insinuaba una falla oculta, pero su naturaleza seguía siendo un misterio.
La laguna jurídica y la salvaguardia:
La La presunta "laguna jurídica" se debe a la presencia de una función de conversión booleana. En ausencia de operadores de comparación de igualdad explícitos, esta función puede permitir comparaciones implícitas mediante == o !=. Sin embargo, esta laguna puede provocar un comportamiento inesperado, como lo demuestra:
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 introdujo el modismo safe-bool y C 11 implementó una función de conversión bool explícita para evitar esta laguna.
El contraste con std::shared_ptr:
A diferencia de std::function, std::shared_ptr tiene una semántica de igualdad bien definida. Dos punteros son iguales si ambos están vacíos o si ambos no están vacíos y apuntan al mismo objeto. Esta clara definición permitió la implementación de operadores de comparación de igualdad en std::shared_ptr.
The Enigma Unraveled:
La razón para no hacer que std::function igualdad sea comparable surge del desafío inherente de definir un criterio de igualdad significativo para tipos arbitrarios invocables. Si se aplica, supondría una carga para todos los implementadores de objetos de función y aún podría dar lugar a comparaciones ambiguas debido a diferencias en los argumentos vinculantes. Además, la ausencia de operadores de igualdad cierra efectivamente la laguna que surge de las conversiones implícitas.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3