Die ärgerlichste Analyse

Lesezeit: 1 Minute

Die argerlichste Analyse
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.

  • 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

1647198607 554 Die argerlichste Analyse
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();
}

  • Ich weiß zwar, dass der Standard in §13.1/3 sagt, dass der Timer-Funktionstyp so angepasst wird, dass er in dieser Situation ein Zeiger auf den Funktionstyp wird, aber warum sollte jemand wollen, dass er von Anfang an angepasst wird? Es schien mir, dass §13.1/3 das ganze Problem der „ärgerlichsten Analyse“ geschaffen hat?

    – Zach sah

    6. Februar 2014 um 2:35 Uhr

998780cookie-checkDie ärgerlichste Analyse

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy