我敢打赌,这是一个编译器错误。
我看到如果我写进去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()
, with
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()>
{ };
编译器抱怨但有不同的错误
示例.cpp
(12): 错误 C2440: '初始化': 无法从 '初始化列表' 转换为 'std::variant...>'
(12): 注意:目标类型没有构造函数
(13): 注意:请参阅正在编译的类模板实例化“get_index>”的引用
编译器返回:2
似乎,由于我无法理解的原因,编译器看不到std::variant<tag<Ts>...>
, 里面get_index
, as a std::variant
及其所有方法。