MSVC: переменная с нестатической продолжительностью хранения не может использоваться в качестве нетипичного аргумента - PullRequest
0 голосов
/ 08 июня 2018

Рассмотрим следующий код, вдохновленный этим докладом :

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 ?

Годболт ссылка

1 Ответ

0 голосов
/ 08 июня 2018

Это ошибка, у visual есть некоторые проблемы с псевдонимом, которые устраняют необходимость в typename.И здесь дело обстоит так: type_at

template<std::size_t I>
using type_at = std::tuple_element_t<I, std::tuple<Ts...>>;

Обходной путь должен заменить использование псевдонима type_at на псевдонимы:

using even_common_type = std::common_type_t<
    type_at<(2u * Is)>
...>;

на

using even_common_type = std::common_type_t<
    typename std::tuple_element<2 * Is, std::tuple<Ts...>>::type
...>;

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...