Jak jsem poznamenal v komentáři, G++ nepodporuje inicializátory určené standardem C99, ale podporuje rozšíření GNU na C90, které umožňuje určené inicializátory. Takže to nefunguje:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Ale tohle:
union value_t my_val = { v_f: 3.5f };
Zdá se, že jde o špatnou interakci koordinace mezi výbory pro standardy C a C++ (neexistuje žádný zvlášť dobrý důvod, proč C++ nepodporuje syntaxi C99, jen to nezvážili) a politikou GCC (C++ by nemělo t podporuje syntaxi C99 jen proto, že je v C99, ale měla by podporovat syntaxi rozšíření GNU, která dosahuje přesně toho samého, protože jde o rozšíření GNU, které lze aplikovat na oba jazyky).
Dnes jsem narazil na stejný problém. g++ s -std=c++11 a c++14 podporuje určené inicializátory, ale přesto se může zobrazit chyba kompilace „test.cxx:78:9:pardon, neimplementováno:netriviální určené inicializátory nejsou podporovány“, pokud neinicializujte strukturu v pořadí, v jakém jsou její členové definováni. Jako příklad
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};