c++ - 这个 c++17 模板类型推导是 MSVC 中的一个 bug 吗?
问题描述
请查看此代码 - 我将其从我的真实代码中简化到最低限度:
#include <type_traits>
template<auto First, auto Last>
class EnumIterator
{
static_assert(std::is_same<decltype(First), decltype(Last)>::value == true,
"First and Last must be of the same enum class type");
public:
using EnumType = decltype(First);
};
enum class E1 { e1_a, e1_b };
using E1_It = EnumIterator<E1::e1_a, E1::e1_b>;
enum class E2 { e2_a, e2_b };
using E2_It = EnumIterator<E2::e2_a, E2::e2_b>;
E2_It::EnumType e = E2::e2_a;
在 Visual Studio 2017 上,设置为 c++17 的语言编译失败,并显示:
error C2440: 'initializing': cannot convert from 'E2' to 'EnumIterator<E1::e1_a,E1::e1_b>::EnumType'
note: Conversion to enumeration type requires an explicit cast (static_cast, C-style cast or function-style cast)
我在 wandbox.com 上验证了相同的代码编译,并且编译正常。注意,注释掉这一行,using E1_It
现在它可以用 MSVC 编译。
我是否发现了编译器错误,或者我做错了什么?
解决方案
推荐阅读
- javascript - JS React:this.x is not a function 的错误,即使 this.x 函数已绑定
- javascript - 创建一个包含 20 个随机数的数组
- java - android CallLog中subscription_id的含义
- javascript - Uncaught In promise Dom 异常
- reactjs - 为什么反应组件状态没有更新
- html - bootstrap : onclick navbar margin-top = 10 vh;
- android - 在芯片组中设置芯片文本的问题
- css - 如何移动倾斜的 div
- javascript - 重置函数,它将根据上次运行的两个函数中的哪一个将字段重置为它们的值
- batch-file - 如何使用批处理文件查找当前正在运行的同名进程