El análisis más desconcertante

2 minutos de lectura

El analisis mas desconcertante
Shamim Hafiz – MSFT

Obtuve el código de aquí.

class Timer {
 public:
  Timer();
};

class TimeKeeper {
 public:
  TimeKeeper(const Timer& t);

  int get_time()
  {
      return 1;
  }
};

int main() {
  TimeKeeper time_keeper(Timer());
  return time_keeper.get_time();
}

Por lo que parece, debería obtener un error de compilación debido a la línea:

TimeKeeper time_keeper(Timer());

Pero solo sucede si return time_keeper.get_time(); está presente.

¿Por qué importaría esta línea, el compilador detectaría ambigüedad en time_keeper(Timer() ) construcción.

  • posible duplicado de ¿Por qué no hay llamada al constructor?

    – mmmmmm

    8 de marzo de 2013 a las 18:55

  • ¿Responde esto a tu pregunta? Constructor predeterminado con corchetes vacíos

    – Ken SN

    28 de octubre de 2020 a las 8:13

1647547571 686 El analisis mas desconcertante
boaz yaniv

Esto se debe al hecho de que TimeKeeper time_keeper(Timer()); se interpreta como una declaración de función y no como una definición de variable. Esto, por sí mismo, no es un error, pero cuando intenta acceder a la get_time() miembro de time_keeper (que es una función, no una instancia de TimeKeeper), su compilador falla.

Así es como su compilador ve el código:

int main() {
  // time_keeper gets interpreted as a function declaration with a function argument.
  // This is definitely *not* what we expect, but from the compiler POV it's okay.
  TimeKeeper time_keeper(Timer (*unnamed_fn_arg)());

  // Compiler complains: time_keeper is function, how on earth do you expect me to call
  // one of its members? It doesn't have member functions!
  return time_keeper.get_time();
}

  • Si bien sé que el estándar dice en §13.1/3 que el tipo de función del temporizador se ajusta para convertirse en un puntero al tipo de función en esta situación, pero ¿por qué querría alguien que se ajustara para empezar? Me pareció que §13.1/3 creó todo el problema del ‘análisis más desconcertante’.

    – Zach vio

    6 de febrero de 2014 a las 2:35

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad