Рассмотрим следующий код, вдохновленный этим докладом :
template<typename, typename...>
struct even_common_type_helper_impl;
template<std::size_t... Is, typename... Ts>
struct even_common_type_helper_impl<std::index_sequence<Is...>, Ts...>
{
template<std::size_t I>
using type_at = std::tuple_element_t<I, std::tuple<Ts...>>;
using even_common_type = std::common_type_t<type_at<2 * Is>...>;
};
template<typename... Ts>
using even_common_type_helper =
even_common_type_helper_impl<std::make_index_sequence<sizeof...(Ts) / 2>, Ts...>;
template<typename... Ts>
using even_common_type = typename even_common_type_helper<Ts...>::even_common_type;
По сути, я получаю пакет параметров типа шаблона и пытаюсь извлечь общий тип всех типов, расположенных на четномпозиций в этом пакете.
Приведенный выше код работает с gcc 8.1 и clang 6.0 , но не работает с последней версией MSVC со следующейошибка:
ошибка C2971: 'std :: tuple_element_t': параметр шаблона '_Index': 'I': переменная с нестатической продолжительностью хранения не может использоваться в качестве аргумента не-типа
Я пропускаю какие-либо важные детали или это просто еще одна ошибка MSVC ?
Годболт ссылка