Heim >Backend-Entwicklung >C++ >Können C 20-Klassenvorlagenkonstruktoren redundante Vorlagenparameterlisten weglassen?

Können C 20-Klassenvorlagenkonstruktoren redundante Vorlagenparameterlisten weglassen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-19 15:12:03400Durchsuche

Can C  20 Class Template Constructors Omit Redundant Template Parameter Lists?

Können Klassenvorlagenkonstruktoren in C 20 eine redundante Vorlagenparameterliste haben?

In C 17 war es zulässig, Klassenvorlagenkonstruktoren zu deklarieren mit einer redundanten Vorlagenparameterliste, wie durch den folgenden Code veranschaulicht:

template<typename T>
struct S {
    S<T>();
};

Allerdings mit dem Aufkommen von C 20 und der Implementierung von Kompatibilitätsänderungen löst der oben genannte Code nun einen Fehler im GCC-Trunk aus (für -std=c 20). Clang Trunk hingegen kompiliert den Code ohne Probleme. Diese Inkonsistenz wirft die Frage auf: Ist dies ein Fehler oder eine beabsichtigte bahnbrechende Änderung, die noch nicht vollständig in allen Compilern implementiert wurde?

Die Antwort

Die Antwort liegt in a subtile Änderung in der C 20-Spezifikation. Konkret wurde folgender Abschnitt überarbeitet:

[class.ctor]

„Ein Konstruktor wird durch eine Deklaration eingeführt, deren Deklarator ein Funktionsdeklarator der Form ist:

ptr-declarator ( parameter-declaration-clause ) noexcept-specifier attribute-specifier-seq

Wobei der PTR-Deklarator ausschließlich aus einem ID-Ausdruck besteht, einem optionalen attribute-specifier-seq und optionale umgebende Klammern, und der ID-Ausdruck hat eine der folgenden Formen: „

Im Fall einer Member-Deklaration innerhalb einer Klassenvorlage muss der ID-Ausdruck jetzt sein der injizierte Klassenname der unmittelbar einschließenden Entität.

Daher erlaubte C 17 S() als Konstruktordeklaration innerhalb der Vorlage S, C 20 erfordert stattdessen S(). Diese Änderung beseitigt effektiv die Redundanz und stimmt mit CWG 2237 überein, das potenziell fehleranfällige Praktiken anspricht.

Daher ist der auf dem GCC-Trunk mit -std=c 20 aufgetretene Fehler kein Fehler, sondern ein Hinweis auf den Fehler In C 20 eingeführte Änderung. Compiler, die diese Änderung noch nicht implementiert haben, werden den alten Code weiterhin erfolgreich kompilieren, während diejenigen, die sie implementiert haben, sich an den neuen halten Anforderung.

Das obige ist der detaillierte Inhalt vonKönnen C 20-Klassenvorlagenkonstruktoren redundante Vorlagenparameterlisten weglassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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