Der folgende Code kompiliert und ausgeführt in gcc 4.9.1 und clang-3.6 bei Verwendung von -std = C++ 11:Initialisierung des statischen constexpr Element-Array in gcc 4.8
struct Bar
{
int x;
};
struct Foo
{
static constexpr Bar bars[] = {1, 2, 3};
};
constexpr Bar Foo::bars[];
Jedoch versagt es in gcc 4.8.3, was zu der Fehlermeldung
./cpptest.cpp:14:43: error: could not convert '1' from 'int' to 'const Bar'
static constexpr Bar bars[] = {1, 2, 3};
^
./cpptest.cpp:14:43: error: could not convert '2' from 'int' to 'const Bar'
./cpptest.cpp:14:43: error: could not convert '3' from 'int' to 'const Bar'
Übrigens, wenn ich das gleiche tun, aber bars
eine statische const globale Array machen, kompiliert es in gcc 4.8 und Klappern in Ordnung. Es wird auch gut kompilieren, wenn ich jedes der Integer-Literale in der Liste mit einem zusätzlichen Paar {}
umgeben.
Also ist das ein Fehler in gcc 4.8? Was sagt der Standard dafür? Welcher Teil des einheitlichen Initialisierungsstandards C++ 11 wird aufgerufen, wenn ich die zusätzlichen Klammern weglasse?
Bearbeiten: Es sieht aus wie der Standard besagt, dass dies Aggregat Initialisierung aufrufen sollte, die für "Klammer Elision" ermöglichen sollte. Es scheint also, dass es ein Fehler in gcc 4.8 ist, der von gcc 4.9 behoben wurde, aber ich bin überhaupt nicht zuversichtlich, den Standard zu lesen. Ich kann auch keinen Bugreport in gcc's Bug Tracker finden, deswegen könnte ich leicht falsch liegen.
Haben Sie es als Fehler betrachtet, der behoben wurde? – edmz