El análisis más desconcertante: desentrañar la ambigüedad en C 11
La ambigüedad del "análisis más desconcertante" en C 11 se presenta cuando se utilizan inicializadores uniformes, como se evidencia en el siguiente fragmento de código:
#include
class Timer
{
public:
Timer() {}
};
int main()
{
auto dv = Timer(); // Ambiguity: Object or function call?
int time_keeper(Timer()); // Ambiguity: Pointer or call?
return 0;
}
Comprensión de la primera expresión (auto dv = Timer())
En la primera expresión, la palabra clave auto implica que el tipo de dv se infiere del inicializador en el lado derecho del signo igual (=). El inicializador es una llamada al constructor Timer sin argumentos, que devuelve un objeto Timer. Por lo tanto, dv es un objeto de tipo Temporizador.
Comprensión de la segunda expresión (int time_keeper(Timer()))
En la segunda expresión, la ambigüedad surge porque el compilador no puede determinar si Timer() es una llamada a función o un objeto de tipo Timer pasado por referencia.
Sin embargo, debido a que las funciones se descomponen en punteros cuando se pasan como argumentos, el verdadero tipo de time_keeper es int(Timer(*)()), lo que resuelve la ambigüedad a favor de la interpretación de puntero a función.
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