コメントで指摘したように、G++ は C99 標準の指定された初期化子をサポートしていませんが、指定された初期化子を許可する C90 の GNU 拡張機能をサポートしています。したがって、これは機能しません:
union value_t {
char * v_cp;
float v_f;
};
union value_t my_val = { .v_f = 3.5f };
しかし、これは:
union value_t my_val = { v_f: 3.5f };
これは、C と C++ の標準化委員会 (C++ が C99 構文をサポートしない理由は特になく、単に考慮していないだけです) と GCC の政治 (C++ はC99にあるという理由だけでC99構文をサポートしませんが、どちらの言語にも適用できるGNU拡張であるため、まったく同じことを実現するGNU拡張構文をサポートする必要があります)。
今日も同じ問題に遭遇しました。 g++ with -std=c++11 および c++14 は指定された初期化子をサポートしますが、コンパイル エラー "test.cxx:78:9:申し訳ありませんが、実装されていません:非自明な指定された初期化子がサポートされていません" が発生する可能性があります。メンバーが定義された順序で構造体を初期化しないでください。例として
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};