Comme je l'ai noté dans un commentaire, G++ ne prend pas en charge les initialiseurs désignés standard C99, mais il prend en charge l'extension GNU vers C90 qui autorise les initialiseurs désignés. Donc ça ne marche pas :
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
Mais ceci ne :
union value_t my_val = { v_f: 3.5f };
Cela semble être une mauvaise interaction de coordination entre les comités de normalisation C et C++ (il n'y a pas de raison particulièrement bonne pour laquelle C++ ne prend pas en charge la syntaxe C99, ils ne l'ont tout simplement pas envisagée) et la politique de GCC (C++ devrait ' ne prend pas en charge la syntaxe C99 simplement parce qu'elle est en C99, mais elle devrait prendre en charge la syntaxe d'extension GNU qui réalise exactement la même chose car il s'agit d'une extension GNU qui peut être appliquée à l'une ou l'autre langue).
J'ai rencontré ce même problème aujourd'hui. g++ avec -std=c++11 et c++14 prend en charge les initialiseurs désignés, mais vous pouvez toujours obtenir une erreur de compilation "test.cxx:78:9:désolé, non implémenté :les initialiseurs désignés non triviaux ne sont pas pris en charge" si vous n'initialisez pas la structure dans l'ordre dans lequel ses membres ont été définis. A titre d'exemple
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};