Come ho notato in un commento, G++ non supporta gli inizializzatori designati standard C99, ma supporta l'estensione GNU a C90 che consente gli inizializzatori designati. Quindi questo non funziona:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Ma questo fa:
union value_t my_val = { v_f: 3.5f };
Questa sembra essere una cattiva interazione di coordinamento tra i comitati per gli standard C e C++ (non c'è una ragione particolarmente buona per cui il C++ non supporti la sintassi C99, semplicemente non l'hanno presa in considerazione) e la politica del GCC (il C++ non dovrebbe t supporta la sintassi C99 solo perché è in C99, ma dovrebbe supportare la sintassi dell'estensione GNU che ottiene esattamente la stessa cosa perché è un'estensione GNU che può essere applicata a entrambe le lingue).
Mi sono imbattuto in questo stesso problema oggi. g++ con -std=c++11 e c++14 supporta gli inizializzatori designati, ma puoi comunque ottenere un errore di compilazione "test.cxx:78:9:sorry, unimplemented:inizializzatori designati non banali non supportati" se tu non inizializzare la struttura nell'ordine in cui sono stati definiti i suoi membri. Ad esempio
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};