Подтвердить что ты не робот

Void_t в списке параметров работает, но не как тип возврата

Вот пример cppreference об использовании псевдонима. Этот пример не работает, потому что int не имеет члена foo:

template<typename...> using void_t = void;
template<typename T> void_t<typename T::foo> f();
f<int>(); // error, int does not have a nested type foo

Это ясно, но когда я попытался поместить часть void_t в список параметров, она неожиданно скомпилирована:

template<typename...> using void_t = void;
template<typename T> void f(void_t<typename T::foo>);
f<int>();

Он компилируется на clang, но не в gcc. Это ошибка?

4b9b3361

Ответ 1

template<class...>struct voider{using type=void;};
template<class...Ts>using void_t=typename voider<Ts...>::type;

существует двусмысленность в стандарте С++ 11 о том, являются ли неиспользованные параметры шаблона шаблону с использованием псевдонимов, которые являются недопустимыми типами/выражениями, являются сбой замены или нет.

gcc и clang интерпретировали предложение по-разному, что, как я думаю, вы видите. Вышеупомянутый void_t должен заставить его работать одинаково как в gcc, так и в clang.