Al emplear la plantilla std::function, ambigüedad pueden surgir debido a múltiples sobrecargas posibles. Específicamente, considere el siguiente fragmento 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.
}
La ambigüedad surge del hecho de que tanto la función
La firma del argumento de plantilla para std::function se considera parte de su tipo durante la declaración y definición. Sin embargo, este no es el caso durante la construcción de objetos.
std::function, como muchos objetos funcionales en C, utiliza una técnica llamada borrado de tipos. Esto le permite aceptar objetos o funciones arbitrarias, siempre que cumplan con la firma esperada cuando se llamen. La desventaja es que los errores relacionados con firmas no coincidentes ocurren en lo profundo de la implementación, en lugar de en el nivel del constructor.
Existen tres opciones principales para evitar esta ambigüedad:
Mientras que el argumento de plantilla de std::function sí lo hace determinar su tipo durante las declaraciones y definiciones, no juega ningún papel en la construcción de objetos. Esto puede generar ambigüedad cuando los constructores aceptan argumentos arbitrarios. Para resolver esto, los programadores pueden usar conversión de tipos explícita, ajuste de objetos de función o TMP.
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