Frage Was macht der C ++ - Compiler bei mehrdeutigen Standardparametern?


Was macht der C ++ - Compiler bei mehrdeutigen Standardparametern? Angenommen, es gibt eine Funktion wie:

void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1, int c = 0);

Ist das Obige mehrdeutig? Wenn nicht, was macht der Compiler (wie ist die Funktion genau abgestimmt) wenn etwas aufgerufen wird function1(10) ?

Vielen Dank!


5
2017-10-04 19:12


Ursprung


Antworten:


Folgendes ist in Ordnung

void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1, int c = 0);

Und das Folgende ist auch in Ordnung

function(); // calls first function

Aber das Folgende ist mehrdeutig

function(1); // second and first match equally well

Für die Überladungsauflösung (der Prozess, der angibt, welche Funktion aufgerufen werden soll), werden Parameter, die keine expliziten Argumente übergeben haben und die Standardargumente verwenden, ignoriert. Daher sieht der Compiler wirklich zwei Funktionen, die beide einen int-Parameter für den obigen Aufruf haben und nicht entscheiden können.

Das Folgende ist jedoch schlecht geformt

void function(int a = 0, float b = 3.1);
void function(int a, float b =1.1);

Während für den Code in Ihrer Frage Sie erklären zwei Funktionen (weil beide Deklarationen eine unterschiedliche Anzahl von Parametern haben), deklarieren Sie in diesem Beispiel nur ein Funktion. Aber die zweite Deklaration davon wiederholt ein Standardargument für einen Parameter (und sogar mit einem anderen Wert, aber das spielt keine Rolle mehr). Das ist nicht erlaubt. Beachten Sie, dass das Folgende in Ordnung ist

void function(int a, float b = 3.1);
void function(int a = 0, float b);

Die Menge der Standardargumente für Deklarationen, die für dieselbe Funktion im selben Bereich angezeigt werden, wird zusammengeführt und nur für diejenigen, die im selben Bereich angezeigt werden. Das Folgende ist also gültig

void function(int a = 0, float b = 3.1);
void function1() {
  void function(int a, float b = 1.1); 
  function(0);
}

Dies ruft die Funktion mit auf 1.1 bestanden für b.


8
2017-10-04 19:21



Wenn sie andere Namen haben (wie in Ihrem Beispiel), gibt es keine Mehrdeutigkeit. Wenn sie den gleichen Namen haben (es handelt sich also um einen Überladungsversuch), wird sich der Compiler beschweren.

Obwohl sich herausstellt, dass Sie die Standardargumente für eine Funktion in einem anderen Bereich neu definieren können (das ist neu für mich ...) - aber im selben Umfang können Sie Standardargumente nicht neu definieren sogar zum selben Wert. ab 8.3.6 / 4 "Standardargumente":

Für Nicht-Template-Funktionen, Standard   Argumente können später hinzugefügt werden   Deklarationen einer Funktion in demselben   Umfang. Erklärungen in verschiedenen   Bereiche haben völlig unterschiedliche Sätze   von Standardargumenten. Das ist,   Deklarationen in inneren Bereichen nicht   Erhalte Standardargumente von   Deklarationen in äußeren Bereichen und umgekehrt   versa. In einer bestimmten Funktion   Deklaration, alle Parameter folgen   zu einem Parameter mit einem Standardargument   soll Standardargumente liefern   in dieser oder früheren Deklarationen. EIN   Standardargument darf nicht sein   durch eine spätere Deklaration neu definiert (nicht   sogar auf den gleichen Wert).


1
2017-10-04 19:15



Mehrdeutig? Sie haben zwei völlig unabhängige unterschiedliche Funktionen: function1 und function2. Sogar die Anzahl der Parameter in jeder Funktion ist unterschiedlich. Hier gibt es keine Zweideutigkeit. Wenn Sie den Compiler auffordern, anzurufen function1(10) es ruft function1(10, 3.1). function2 kommt nicht einmal ins Bild.

Wenn es dieselbe Funktion wäre, würde das Problem der Mehrdeutigkeit nicht einfach deshalb auftreten, weil es in C ++ illegal ist, ein Standardargument für den gleichen Parameter mehr als einmal (innerhalb derselben Übersetzungseinheit) anzugeben. Selbst von dir angeben das Gleiche Standard-Argument Wert das zweite Mal, das Programm ist schlecht gebildet

void foo(int a = 5);
void foo(int a = 5); // <- ERROR

Was man jedoch tun kann, ist eine andere Gruppe von Standardargumenten für die gleiche Funktion anzugeben verschiedene Übersetzungseinheiten. Aber das schafft keine Mehrdeutigkeit, weil der Compiler nur eine Übersetzungseinheit sehen kann. Der Compiler wird einfach nie von einer möglichen "Zweideutigkeit" wissen.


0
2017-10-04 19:17



Außerdem wird die Antwort auf jede Frage, die mit "Was macht der C ++ - Compiler ..." immer lauten wird, "hängt davon ab, von welchem ​​Compiler Sie sprechen."


-1
2017-10-04 19:20