Heim > Backend-Entwicklung > C++ > Wie kann ich implizite Typkonvertierungen in nicht konstruierenden C-Funktionen verhindern?

Wie kann ich implizite Typkonvertierungen in nicht konstruierenden C-Funktionen verhindern?

Mary-Kate Olsen
Freigeben: 2024-12-06 10:26:11
Original
1067 Leute haben es durchsucht

How Can I Prevent Implicit Type Conversions in Non-Constructing C   Functions?

Implizite Konvertierungen in nicht konstruierenden Funktionen vermeiden

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.

Verwenden von Funktionsvorlagen zur Durchsetzung von Typkonflikten

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
Nach dem Login kopieren

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.

Ansatz vor C 11 mit einer Löschüberladung

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)
{}
Nach dem Login kopieren

C 23 Statische Assertion zur Durchsetzung von Typbeschränkungen

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
}
Nach dem Login kopieren

Schlussfolgerung

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage