Lig*_*ica 6 c++ variant visual-studio c++17 visual-studio-2017
巴里给我们这个华丽get_index的变种:
template <typename> struct tag { };
template <typename T, typename V>
struct get_index;
template <typename T, typename... Ts>
struct get_index<T, std::variant<Ts...>>
: std::integral_constant<size_t, std::variant<tag<Ts>...>(tag<T>()).index()>
{ };
Run Code Online (Sandbox Code Playgroud)
使用如下:
using V = variant<A, B, C>;
constexpr const size_t N = get_index<B, V>::value; // 1
Run Code Online (Sandbox Code Playgroud)
它在Clang(OSX)中运行良好.
但在Visual Studio 2017中,我得到以下内容:
<source>(10): error C2039: 'index': is not a member of 'std::variant<tag<Ts>...>'
<source>(10): note: see declaration of 'std::variant<tag<Ts>...>'
<source>(11): note: see reference to class template instantiation 'get_index<T,std::variant<_Types...>>' being compiled
Compiler returned: 2
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.有任何想法吗?
(完全披露:在我的项目中,我实际上正在使用,mpark::variant因为我一直在使用Xcode 9,但没有std::variant.但是,从上面的Godbolt MCVE可以看出这也影响了实现std::variant.我确信问题可能在上面的代码中,也可能在编译器中.)
我敢打赌,这是一个编译器错误。
我看到如果我写进去main()
std::cout << std::variant<tag<int>, tag<float>>{tag<float>{}}.index() << std::endl;
Run Code Online (Sandbox Code Playgroud)
编译器不会抱怨。
如果我编写如下模板函数,也不会抱怨
template <typename T, typename ... Ts>
void foo ()
{ std::cout << std::variant<tag<Ts>...>(tag<T>{}).index() << std::endl; }
Run Code Online (Sandbox Code Playgroud)
我称其为 from main(), with
foo<int, long, int, long long>();
Run Code Online (Sandbox Code Playgroud)
在中声明以下变量也没有问题main()
std::integral_constant<std::size_t, std::variant<tag<int>, tag<float>>(tag<float>{}).index()> ic;
Run Code Online (Sandbox Code Playgroud)
但是如果我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()>
{ };
Run Code Online (Sandbox Code Playgroud)
编译器抱怨但有不同的错误
示例.cpp
(12): 错误 C2440: '初始化': 无法从 '初始化列表' 转换为 'std::variant...>'
(12): 注意:目标类型没有构造函数
(13): 注意:请参阅正在编译的类模板实例化“get_index>”的引用
编译器返回:2
似乎,出于我无法理解的原因,编译器没有将std::variant<tag<Ts>...>, insideget_index视为 astd::variant及其所有方法。
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |