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
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!