Im bereitgestellten Code wird die Funktion so deklariert, dass sie einen ganzzahligen Parameter akzeptiert. Aufgrund der impliziten Umwandlung werden jedoch versehentlich auch Zeichen, boolesche Werte und Long-Werte akzeptiert. Um dieses unerwünschte Verhalten zu verhindern, suchen wir nach Methoden, um eine strikte Typübereinstimmung zu erzwingen und implizite Konvertierungen zu verbieten.
Ein Ansatz zur Vermeidung impliziter Konvertierungen besteht darin, eine Funktionsvorlage zu definieren das mit allen Typen außer dem gewünschten Typ übereinstimmt. Zum Beispiel können wir eine Vorlage für andere Typen erstellen und sie als gelöscht markieren, wodurch ihre Kompilierung effektiv verhindert wird:
void function(int); // this will be selected for int only template<class T> void function(T) = delete; // C++11
Auf diese Weise wird die Nicht-Vorlagenfunktion mit einer direkten Übereinstimmung, in diesem Fall der Void-Funktion, verknüpft (int) wird immer für Ganzzahlen ausgewählt. Jeder Versuch, die Funktion mit anderen Typen aufzurufen, löst aufgrund der gelöschten Vorlage einen Fehler aus.
Vor C 11 war eine andere Methode erforderlich um typstrikte Funktionsaufrufe ohne implizite Konvertierungen zu erreichen. Dazu gehörte das Erstellen einer DeleteOverload-Klasse und deren Verwendung zum Deaktivieren der Überladungsauswahl für unerwünschte Typen:
// because this ugly code will give you compilation error for all other types class DeleteOverload { private: DeleteOverload(void*); }; template<class T> void function(T a, DeleteOverload = 0); void function(int a) {}
C 23 führt eine benutzerfreundlichere Klasse ein Ansatz mit static_assert(false, msg). Dies ermöglicht klarere Fehlermeldungen bei Typkonflikten:
void function(int) {} // this will be selected for int only template<class T> void function(T) { // since C++23 static_assert(false, "function shall be called for int only"); } int main() { function(1); // function(1l); // ^^^^^^^^^^^^ produces error: // error: static assertion failed: function shall be called for int only }
Durch den Einsatz dieser Techniken können wir implizite Konvertierungen in nicht konstruierenden Funktionen vermeiden, eine strengere Typprüfung gewährleisten und potenzielle Fehler eliminieren verursacht durch versehentliche Typkonflikte.
Das obige ist der detaillierte Inhalt vonWie kann ich implizite Typkonvertierungen in nicht konstruierenden C-Funktionen verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!