"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > El análisis más desconcertante: Timer() - ¿Llamada a objeto o función?

El análisis más desconcertante: Timer() - ¿Llamada a objeto o función?

Publicado el 2024-12-21
Navegar:182

The Most Vexing Parse: Timer() - Object or Function Call?

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.

  • Si Timer() es una llamada a función, entonces int time_keeper(Timer()) declara una función llamada time_keeper que toma un objeto Timer como entrada y devuelve un int.
  • Si Timer() es un objeto de tipo Timer, entonces int time_keeper(Timer()) declara una función llamada time_keeper que toma un puntero a un objeto Timer como entrada y devuelve un int.

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.

Último tutorial Más>

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