
Shamim Hafiz – MSFT
Den Code habe ich von Hier.
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();
}
So wie es aussieht, sollte es aufgrund der Zeile einen Kompilierungsfehler erhalten:
TimeKeeper time_keeper(Timer());
Aber es passiert nur, wenn return time_keeper.get_time();
ist anwesend.
Warum sollte diese Zeile überhaupt eine Rolle spielen, würde der Compiler Mehrdeutigkeiten erkennen time_keeper(Timer() )
Konstruktion.

Boas Janiv
Das liegt daran, dass TimeKeeper time_keeper(Timer());
wird als Funktionsdeklaration und nicht als Variablendefinition interpretiert. Dies ist an sich kein Fehler, aber wenn Sie versuchen, auf die get_time()
Mitglied von time_keeper (das eine Funktion ist, keine TimeKeeper-Instanz), schlägt Ihr Compiler fehl.
So sieht Ihr Compiler den Code:
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();
}
9987800cookie-checkDie ärgerlichste Analyseyes
mögliches Duplikat von Warum gibt es keinen Aufruf an den Konstruktor?
– mmmmmm
8. März 2013 um 18:55 Uhr
Beantwortet das deine Frage? Standardkonstruktor mit leeren Klammern
– Ken YN
28. Oktober 2020 um 8:13 Uhr