Heim >Backend-Entwicklung >C++ >Warum können C-Funktionen nicht allein auf der Grundlage der Konstanz eines Nicht-Zeiger- und Nicht-Referenz-Arguments überladen werden?
Funktionen mit Const-Argumenten überladen: Warum das nicht möglich ist
In C ermöglicht das Überladen einer Funktion mehrere Funktionen mit demselben Namen, aber verschiedene Parameterlisten, die innerhalb einer Klasse koexistieren sollen. Allerdings kann man Funktionen nicht allein auf der Grundlage der Konstanz eines Nicht-Zeiger- oder Nicht-Referenz-Parameters überladen.
Betrachten Sie das folgende Codebeispiel:
#include <iostream> using std::cout; class Test { public: Test() {} int foo(const int) const; // const function int foo(int); // non-const function }; int main() { Test obj; Test const obj1; int variable = 0; do { obj.foo(3); // Call the const function obj.foo(variable); // Attempt to call the non-const function variable++; usleep(2000000); } while (1); } int Test::foo(int a) { cout << "NON CONST" << std::endl; a++; return a; } int Test::foo(const int a) const { cout << "CONST" << std::endl; return a; }
Wie aus dem Code hervorgeht, haben wir Versuchen Sie, die foo-Methode basierend auf der Konstanz des Arguments zu überladen: eine konstante Version, die konstante Argumente akzeptiert, und eine nicht konstante Version, die nicht konstante Argumente akzeptiert. Dieser Code führt jedoch zu einem Kompilierungsfehler, der besagt, dass die Funktion nicht überladen werden kann.
Dieser Fehler entsteht, weil C keine Überladung zulässt, die nur auf der Konstanz eines Nicht-Zeiger-, Nicht-Referenztyps basiert. Der Grund dafür ist, dass bei der Übergabe eines Wertarguments das eigentliche Argument in eine temporäre Variable innerhalb der aufgerufenen Funktion kopiert wird. Diese Kopie unterscheidet sich vom ursprünglichen Argument und ihre Konstanz hat keinen Einfluss auf die Konstanz des ursprünglichen Arguments.
Daher wird im obigen Beispiel beim Aufruf von obj.foo(3) eine temporäre Kopie des Literals erstellt 3 wird erstellt und an die const-Funktion übergeben. Ebenso wird beim Aufruf von obj.foo(variable) eine temporäre Kopie der Variablen erstellt und an die nicht konstante Funktion übergeben. Der Compiler kann zwischen diesen beiden Fällen nicht allein aufgrund der Konstanz des Arguments unterscheiden.
Zusammenfassend lässt sich sagen, dass das Überladen von Funktionen basierend auf der Konstanz eines Nicht-Zeiger- und Nicht-Referenztyps in C nicht zulässig ist. Dies liegt daran, dass die Konstanz eines Wertarguments keinen Einfluss auf die Konstanz des Arguments innerhalb der Funktion hat und der Compiler nicht allein anhand des Argumenttyps zwischen den beiden unterscheiden kann.
Das obige ist der detaillierte Inhalt vonWarum können C-Funktionen nicht allein auf der Grundlage der Konstanz eines Nicht-Zeiger- und Nicht-Referenz-Arguments überladen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!