Zum Beispiel, warum kann ich nicht schreiben:Warum kann ich vorherige Argumentwerte nicht verwenden, um Argumentstandardwerte zu definieren?
void f(double x, double y = x);
eine Funktion f
zu erklären, für die f(x)
der Aufruf von f(x,x)
entspricht?
Falls Ihnen das nicht nützlich erscheint, hier ein mögliches Anwendungsszenario. In diesem Beispiel erkläre ich f
wie folgt:
void f(double x, double y = expensiveComputation(x));
wo expensiveComputation
bedeutet, Sie ahnen es, eine Funktion, die eine sehr langsame Berechnung der Fall ist. Ich möchte dem Benutzer von f
die Möglichkeit geben, den Wert von y
zu übergeben, wenn er es zuvor berechnet hat, also muss ich es innerhalb f
nicht erneut berechnen. Nun, natürlich kann ich dies auch durch das Schreiben zwei Überlastungen beheben:
void f(double x, double y);
void f(double x) { f(x, expensiveComputation(x)); }
aber Überlastungen Schreiben wird ermüdend wie die Anzahl der Argumente wächst. Versuchen Sie beispielsweise zu schreiben:
mit Überladungen. Es ist nur hässlicher. Standardargumente sind sexy. Gibt es einen tieferen syntaktischen Grund, warum vorherige Argumente nicht zum Definieren von Argument-Standardwerten verwendet werden können?
Wenn Sie diese Syntax zulassen, würde die Implementierung Argumente von links nach rechts auswerten? – Brian
@Brian Guter Punkt. Warum ist die Implementierung nicht gezwungen, Argumente von links nach rechts zu bewerten? Ich habe vergessen ... – becko
Auf vielen Plattformen ist die Standardaufrufkonvention, Argumente von links nach rechts auf den Stapel zu schieben. (Der Aufgerufene erscheint dann von links nach rechts.) – Brian