Комментарий от @ PiotrSkotnicki :
emplace_back
- это шаблон функции, который пытается определить типы аргументов.список инициализаторов не имеет типа, поэтому вывод не выполняется.
Разъясняет проблему.
Альтернативный способ «исправить» эту проблему - передать rvalue нужного типав качестве аргумента конструктора, вместо списка инициализатора:
EntryDef(ID &&id, FType ft, … ) : mid(std::forward<ID>(id)), ftype(ft), … {}
Вызывается как:
Def a;
a.ent.emplace_back(ID{ 2, 1 }, FType::FD_NONE, …);
Живой пример ЗДЕСЬ .