Initialisierung eines statischen consExpr-Klassenelements vom Typ enum-class durch explizite Konvertierungsfunktion

9

Ich habe eine Diskrepanz zwischen dem Verhalten von g ++ 4.8.1 und clang ++ 3.4.

Ich habe eine Klasse A vom Literaltyp, die eine explicit constexpr -Konvertierungsfunktion hat, um enum class E einzugeben.

Gcc ermöglicht es mir, constexpr Variablen vom Typ E von einem konstanten Ausdruck vom Typ A zu initialisieren, in einigen Fällen mit der Konvertierungsfunktion, aber nicht, wenn die Variable ein statisches Klassenmitglied ist ( e2 unten)

Clang lehnt die Initialisierung in allen Kontexten ab ( e1 , e2 und e3 ).

Laut [over.match.conv]p1 ist die Verwendung einer expliziten Konvertierungsfunktion hier OK

%Vor%

Ich sehe ein ähnliches Muster bei der Konvertierung in einen anderen literalen Klassentyp anstelle eines Aufzählungstyps - g ++ lehnt die Initialisierung von s1 ab, clang lehnt die Initialisierung von s1 , s2 und s3 ab. Ich denke, diese sollten ebenfalls gültig sein, wie pro [over.match.copy]p1 .

%Vor%

Welcher Compiler, wenn einer der beiden richtig ist?

Bearbeiten: Ein paar interessante Dinge zu beachten:

  1. Die Ergebnisse unterscheiden sich zwischen clang-3.4 und clang-svn, siehe Kommentare unten.
  2. Bei der Verwendung von Parens anstelle von geschweiften Klammern gibt es immer noch einen Unterschied zwischen e2 / s2 und e1 / e3 / s1 / s3 , siehe Ссылка . gcc und clang-svn stimmen zu, aber ich bin nicht davon überzeugt, dass die Ablehnung von e2 und s2 korrekt ist.
je4d 07.01.2014, 13:16
quelle

1 Antwort

3

Seltsamerweise scheint Clang diese zu verwerfen.

Der Grund ist, dass es einen Fehler im C ++ 11-Standard gibt, in dem {} nicht für Kopierkonstruktoren funktioniert. Deshalb arbeiten () -Konstruktoren, aber {} -Konstruktoren nicht.

Bjarne Stroustrup sagt unter dem Errata für sein Buch , dass es in C ++ 14 behoben ist

    
Edward 26.01.2014 12:58
quelle

Tags und Links