O enigma:
Por que std::function, um componente integral das modernas bases de código C, não dotado de recursos de comparação de igualdade? Esta questão tem deixado os programadores perplexos desde o seu início, levando a confusão e dificuldades no gerenciamento de coleções de objetos que podem ser chamados. 11, sobrecargas para operador== e operador!= foram declaradas, mas excluídas, deixando um vazio que nunca foi explicado adequadamente. O comentário que acompanha "possível buraco próximo no sistema de tipos" sugeria uma falha oculta, mas sua natureza permaneceu um mistério. a suspeita de "brecha" decorre da presença de uma função de conversão booleana. Na ausência de operadores de comparação de igualdade explícitos, esta função pode permitir comparações implícitas via == ou!=. No entanto, essa lacuna pode levar a um comportamento inesperado, conforme demonstrado por:
struct S { operador bool() { retornar falso; } }; int principal() { S uma, b; bool are_equal(a == b); // Usa o operador bool em a e b! }
C 03 introduziu o idioma safe-bool e C 11 implementou uma função de conversão bool explícita para evitar essa lacuna.The Contrast with std::shared_ptr:
Ao contrário de std::function, std::shared_ptr tem semântica de igualdade bem definida. Dois ponteiros são iguais se ambos estiverem vazios ou se não estiverem vazios e apontarem para o mesmo objeto. Esta definição clara permitiu a implementação de operadores de comparação de igualdade em std::shared_ptr.struct S {
operator bool() { return false; }
};
int main() {
S a, b;
bool are_equal(a == b); // Uses operator bool on a and b!
}
A justificativa para não tornar std::function igualdade comparável decorre do desafio inerente de definir um critério de igualdade significativo para tipos arbitrários que podem ser chamados. Se aplicado, representaria um fardo para todos os implementadores de objetos de função e ainda poderia levar a comparações ambíguas devido a diferenças nos argumentos de ligação. Além disso, a ausência de operadores de igualdade efetivamente fecha a lacuna que surge das conversões implícitas.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3