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
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
.
Welcher Compiler, wenn einer der beiden richtig ist?
Bearbeiten: Ein paar interessante Dinge zu beachten:
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. 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
Tags und Links c++ c++11 constexpr enum-class