Ответ 1
Как указано в комментариях выше: Любое сообщение об ошибке, которое вы получаете от GCC, которое содержит фразы internal compiler error
и Please submit a full bug report
, определенно является ошибкой компилятора, а не вашей собственной ошибкой! В этом случае ошибка, похоже, связана с GCC-анализом {{ ... }}
в режиме С++, где "...
" включает назначенный инициализатор. @Sam сообщила об этом как GCC ошибка 59832.
Однако, как заметил @Angew, эта строка -
messages_.push_back({{ .byte = 'a' }});
- недействителен С++. Стандартный С++ не позволяет назначать инициализаторы; что функция C99, которая не была принята в С++ (ни С++ 11, ни С++ 14).
Что касается того, почему назначенные инициализаторы были проблематичными для добавления в С++, см. здесь, где Дуг Грегор спрашивает, как компилятор должен интерпретировать такие вещи, как
struct Foo {int x,y; };
void f(Foo);
void f(std::initializer_list<int>);
int main(){
f({1});
f({1,2});
f({1,2,3});
f({.x=1});
f({.x=1,2});
f({.x=1,2,3});
}
Для записи GCC 4.8 рассматривает все шесть в качестве вызовов f(initializer_list<int>)
. Clang 3.5 рассматривает первые три в качестве вызовов f(initializer_list<int>)
, а следующие два - в качестве вызовов f(Foo)
, а последний - неправильно сформированный. В принципе, это нестандартная конструкция: разные компиляторы находятся в пределах своих прав, чтобы относиться к ней по-другому, и они это делают.