Бьюсь об заклад, мои 2 цента - это ошибка компилятора.
Я вижу, что если я напишу в main()
std::cout << std::variant<tag<int>, tag<float>>{tag<float>{}}.index() << std::endl;
, компилятор не будет жаловаться.
И не жалуется также, если я напишу шаблонную функцию следующим образом
template <typename T, typename ... Ts>
void foo ()
{ std::cout << std::variant<tag<Ts>...>(tag<T>{}).index() << std::endl; }
и я вызываю ее, начиная с main()
, с
foo<int, long, int, long long>();
Нет проблем с объявлениемследующая переменная в main()
std::integral_constant<std::size_t, std::variant<tag<int>, tag<float>>(tag<float>{}).index()> ic;
Но если я изменю специализацию get_index
следующим образом (используя круглые скобки для инициализации вместо круглых скобок)
template <typename T, typename... Ts>
struct get_index<T, std::variant<Ts...>>
: std::integral_constant<std::size_t, std::variant<tag<Ts>...>{tag<T>()}.index()>
{ };
компилятор жалуется, но сдругая ошибка
example.cpp
(12): ошибка C2440: «инициализация»: невозможно преобразовать из «списка инициализаторов» в «std :: вариан ...>»
(12): примечание: у целевого типа нет конструкторов
(13): примечание: см. Ссылку на создание экземпляра шаблона класса 'get_index>', скомпилированного
Возвращен компилятор: 2
Кажется, что по причинам, которые я не могу понять, компилятор не видит std::variant<tag<Ts>...>
, внутри get_index
, какstd::variant
со всеми его методами.