Ao empregar o modelo std::function, ambiguidade pode surgir devido a múltiplas sobrecargas plausíveis. Especificamente, considere o seguinte trecho de código:
#include
using namespace std;
int a(const function& f) { return f(); }
int a(const function& f) { return f(0); }
int x() { return 22; }
int y(int) { return 44; }
int main() {
a(x); // Call is ambiguous.
a(y); // Call is ambiguous.
}
A ambigüidade decorre do fato de que function
A assinatura do argumento do modelo para std::function é considerada parte de seu tipo durante a declaração e definição. No entanto, este não é o caso durante a construção do objeto.
std::function, como muitos objetos funcionais em C , usa uma técnica chamada apagamento de tipo. Isso permite aceitar objetos ou funções arbitrárias, desde que satisfaçam a assinatura esperada quando chamados. A desvantagem é que erros relacionados a assinaturas incompatíveis ocorrem profundamente na implementação, e não no nível do construtor.
Existem três opções principais para contornar essa ambiguidade:
Enquanto o argumento do modelo de std::function determina seu tipo durante declarações e definições, mas não desempenha nenhum papel na construção do objeto. Isto pode levar à ambiguidade quando os construtores aceitam argumentos arbitrários. Para resolver isso, os programadores podem usar conversão de tipo explícita, encapsulamento de objeto de função ou TMP.
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