Wie ich in einem Kommentar angemerkt habe, unterstützt G++ keine vom C99-Standard designierten Initialisierer, aber es unterstützt die GNU-Erweiterung von C90, die designierte Initialisierer zulässt. Das funktioniert also nicht:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Aber das tut:
union value_t my_val = { v_f: 3.5f };
Dies scheint ein schlechtes Zusammenspiel zwischen der Koordination zwischen den C- und C++-Standardkomitees (es gibt keinen besonders guten Grund, warum C++ die C99-Syntax nicht unterstützt, sie haben es nur nicht berücksichtigt) und der GCC-Politik (C++ sollte nicht Die C99-Syntax wird nicht unterstützt, nur weil sie in C99 enthalten ist, aber sie sollte die GNU-Erweiterungssyntax unterstützen, die genau dasselbe erreicht, weil dies eine GNU-Erweiterung ist, die auf beide Sprachen angewendet werden kann).
Ich bin heute auf dasselbe Problem gestoßen. g++ mit -std=c++11 und c++14 unterstützt bestimmte Initialisierer, aber Sie können trotzdem einen Kompilierungsfehler „test.cxx:78:9:Entschuldigung, nicht implementiert:nicht-triviale bestimmte Initialisierer werden nicht unterstützt“ erhalten, wenn Sie dies tun Initialisieren Sie die Struktur nicht in der Reihenfolge, in der ihre Mitglieder definiert wurden. Als Beispiel
struct x
{
int a;
int b;
};
// This is correct
struct x x_1 = {.a = 1, .b = 2};
// This will fail to compile with error non-trivial designated initializer
struct x x_2 = {.b = 1, .a = 2};