2015-07-30 7 views
7

Dies ist ein Follow-up auf this question. Der Code in der OP-Frage dort sah für mich ganz vernünftig und eindeutig aus. Warum nicht C++ mit früheren Parametern können Standardwerte letztere Parameter zu definieren, etwa wie folgt:Warum C++ erlaubt keine Funktionsparameter für Standardwerte letztere Parameter?

int foo(int a, int b = a); 

auch, zumindest in C++ 11 deklarierten Typen von Parametern verwendet werden können, den Rückgabetyp zu bestimmen, so es ist nicht unbekannt Funktionsparameter in ähnlicher Weise zu verwenden:

auto bar(int a) -> decltype(a); 

So ist die Frage: was ist die Ursache (n), warum die obige Erklärung von foo nicht erlaubt ist?

+4

Ein Grund, warum ich denken kann, das ist vernünftig, dies eine Einschränkung für Funktionsargument Auswerteauftrag erfordern würde, was derzeit nicht definiert in C++. Dies ist für das Rückgabetypbeispiel nicht erforderlich. – MooseBoys

+0

Abgesehen von der Bequemlichkeit, wenn Sie eine Situation hinzufügen können, in der dies nicht * durch * Überlastung erreicht werden kann, wie die andere Frage beantwortet, würde es einen signifikanten Treibstoff von * brauchen * hinzufügen. Ohne * Notwendigkeit * oder Rückwärtskompatibilität ist das Standardkomitee in der Merkmalserweiterung etwas konservativ. Sie neigen dazu, "Warum nicht?" Zu vermeiden. zugunsten des viel strengeren "warum". – WhozCraig

+0

Als Randnotiz: zwei gängige Aufrufkonventionen in C++ ('__cdecl' und' __stdcall') [Reihenfolge von rechts nach links definieren] (https://msdn.microsoft.com/de-de/library/984x0h58 .aspx) des Arguments übergeben. Wenn Sie Code mit einigen nicht-trivalen (mit benutzerdefinierten Konstruktoren) Parametern als Funktionsargumente debuggen und in einen solchen Aufruf einsteigen, werden Sie feststellen, dass Konstruktoren * tatsächlich * in umgekehrter Reihenfolge aufgerufen werden. –

Antwort

7

Zum einen würde dies erfordern, dass a vor b ausgewertet wird, aber C++ (wie C) nicht die Reihenfolge der Auswertung für Funktionsparameter definieren.

Sie können immer noch den gewünschten Effekt erhalten, indem eine Überlastung hinzufügen:

int foo(int a, int b) 
{ /* do something */ } 

int foo(int a) 
{ return foo(a, a); } 
+1

Ich sehe nicht, wie es relevant ist, dass C++ keine Evaluierungsreihenfolge angibt. Die Verwendung von Parametern in späteren Standardwerten würde natürlich eine teilweise Reihenfolge erzwingen, wenn diese Funktion verwendet wird. Aber ich sehe nicht, wie das ein Problem wäre. Ich denke, der Grund, warum es nicht erlaubt ist, ist nur, dass der Nutzen zu gering wäre. –

Verwandte Themen