Ответ 1
Как вы заметили, это ошибка в gcc. Стандарт гласит:
12.3.2. Функции преобразования [class.conv.fct]
(1) A Функция преобразования никогда не используется для преобразования объекта (возможно, cv-quali-fi) в [...] (возможно, cv-qualified) void.
116) Преобразование в void не вызывает никакой функции преобразования (5.2.9).5.2.9 Статический литье [expr.static.cast]
(6) Любое выражение может быть явно преобразовано в тип cv void, и в этом случае оно становится отброшенным значением выражение (раздел 5).
В качестве обходного пути вы можете написать:
a, void();
Невозможно перегрузить operator,(void)
, поэтому существует нулевая вероятность этого вызывающего определяемого пользователем поведения из конформной реализации.