Warum ist constexpr mit std :: string in gcc erlaubt?

8

Warum darf die Vorlagenversion in gcc kompiliert werden? Ist es ein Compilerfehler oder ist er tatsächlich gültig, wenn er mit Vorlagen verwendet wird? Kann mir das bitte jemand erklären?

Es kompiliert nicht auf clang oder anderen Compilern, die auf godbolt.org verwendet werden.

Die Kompilierungsfehler werden generiert, indem sowohl Zeichenfolge als auch Zeichenfolge in einem conexpr verwendet werden.

%Vor%     
mantler 21.03.2017, 11:41
quelle

1 Antwort

8

GCC könnte hier richtig liegen. Laut dcl.constexpr Absatz 6:

  

Wenn die instanziierte Template-Spezialisierung einer constexpr-Funktion   Vorlage oder Elementfunktion einer Klassenvorlage würde nicht genügen   die Voraussetzungen für eine consExpr-Funktion oder einen consExpr-Konstruktor,   Diese Spezialisierung ist immer noch eine Constexpr-Funktion oder Constexpr   Konstruktor, obwohl ein Aufruf einer solchen Funktion nicht in einem   konstanter Ausdruck. Wenn keine Spezialisierung der Vorlage würde   erfüllen die Anforderungen für eine consExpr-Funktion oder consExpr   Konstruktor, wenn er als Nicht-Template-Funktion oder Konstruktor betrachtet wird,   die Vorlage ist schlecht geformt, keine Diagnose erforderlich.

Das Programm ist schlecht formatiert ( std::string ist kein Literaltyp), aber es ist nicht erforderlich, eine Diagnose zu senden.

    
user7744704 21.03.2017, 12:12
quelle

Tags und Links