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.
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();
}
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