首页 > 解决方案 > 这个 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 编译。

我是否发现了编译器错误,或者我做错了什么?

标签: c++c++17

解决方案


推荐阅读