Суть проблемы может быть уменьшена до:
#include <utility>
struct probe_message
{
int id;
};
int main()
{
probe_message a;
probe_message b{std::move(a)};
}
, которая отклоняется gcc 4.9.4, принимается gcc 5+ и исправляется заменой { }
на ( )
.
Я полагаю, что это та же проблема, что и в Приоритет инициализации списка для объекта того же типа , адресуемого DR 1467.
gcc 4 объединяет инициализацию со списком, ине может конвертировать std::move(a)
в int
.В более поздних версиях копирование или построение перемещения выполняются из списка одного элемента того же типа.
Отчет о дефектах не был разрешен до тех пор, пока после публикации C ++ 14, кажется, слишком поздно для gcc 4.