Ответ 1
Это происходит в результате CWG Issue 1558 и теперь считается ошибкой в gcc (в частности 64395 - исправлено в настоящее время). Идея этой проблемы заключается в том, что, поскольку вы фактически не используете параметры шаблона здесь:
template <typename...> using void_t = void;
нет ошибки замены, независимо от того, какие типы или выражения вы пытаетесь передать.
К счастью, существует легкое обходное решение, которое не связано с обновлением вашего компилятора. Мы можем переписать void_t
, чтобы фактически использовать его пакет параметров, тем самым вызывая сбой замены:
namespace void_details {
template <class... >
struct make_void { using type = void; };
}
template <class... T> using void_t = typename void_details ::make_void<T...>::type;
Это сделает ваш пример правильным для всех версий gcc, которые я пробовал.