Como señalé en un comentario, G++ no es compatible con los inicializadores designados estándar de C99, pero sí es compatible con la extensión GNU para C90, que permite los inicializadores designados. Así que esto no funciona:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Pero esto sí:
union value_t my_val = { v_f: 3.5f };
Esto parece ser una mala interacción de coordinación entre los comités de estándares de C y C++ (no hay una razón particularmente buena por la que C++ no admita la sintaxis de C99, simplemente no la han considerado) y la política de GCC (C++ no debería No admite la sintaxis C99 solo porque está en C99, pero debería admitir la sintaxis de la extensión GNU que logra exactamente lo mismo porque es una extensión GNU que se puede aplicar a cualquier idioma).
Me encontré con este mismo problema hoy. g++ con -std=c++11 y c++14 admite inicializadores designados, pero aún puede obtener un error de compilación "test.cxx:78:9:lo siento, no implementado:inicializadores designados no triviales no admitidos" si no inicialice la estructura en el orden en que se han definido sus miembros. Como ejemplo
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};