Ich stolperte über den Code, den ich nicht verstehe. Hier ist eine vereinfachte Version davon:C++ 98 geschweifte Klammer const skalare Initialisierung
template <int> struct A {};
int const i = { 42 };
typedef A<i> Ai;
int const j = 42;
typedef A<j> Aj;
Dieser Code kompiliert mit GCC in C++ 98-Modus, aber nicht in Clang. Clang erzeugt den folgenden Fehler:
$ clang -Wall -Wextra -std=c++98 -c test.cpp
test.cpp:4:11: error: non-type template argument of type 'int' is not an integral constant expression
typedef A<i> Ai;
^
test.cpp:4:11: note: initializer of 'i' is not a constant expression
test.cpp:3:11: note: declared here
int const i = { 42 };
^
Soweit ich verstehe Initialisierung von int
mit und ohne geschweifte Klammern sollten gleichwertig sein. Clang initialisiert i
korrekt zu 42
, einfach nicht, dass es eine Kompilierzeitkonstante ist.
Dieser Code kompiliert gut in C++ 11-Modus.
Gibt es einen Grund j
wird als Kompilierzeitkonstante behandelt und i
ist nicht? Oder ist es einfach ein Fehler in Clang?
Update: Ich öffnete eine ticket in LLVM Bug Tracker mit diesem Problem.
ich würde sagen, dass es ein Fehler in dem Compiler ist. – Raxvan
@Raxvan: Das ist eine ziemlich kühne Aussage ... In Anbetracht der Tatsache, dass es in C++ 11 und nicht in C++ 98 funktioniert, scheint es ziemlich absichtlich zu sein, also würde ich erwarten, dass es * nach den Spezifikationen * ist (auf Clang-Teil) und gcc ist wie üblich nachsichtiger. –
@MatthieuM .: Ich denke, dass das ist, was er sagen wollte: Es ist ein Fehler in gcc. Es gibt keine C++ 98-Syntax dafür, und clang lehnt dies zu Recht ab. Es ist also ein Fehler, es in gcc zu akzeptieren, obwohl es nicht C++ 98 ist. – PlasmaHH