我有一个函数test,它打印出枚举参数的基础类型:
enum class TestEnum : uint32_t
{
};
template<typename TEnum>
void test(TEnum v)
{ // Line 12
if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,int8_t>)
std::cout<<"int8"<<std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,uint8_t>)
std::cout<<"uint8"<<std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,int16_t>)
std::cout<<"int16"<<std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,uint16_t>)
std::cout<<"uint16"<<std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,int32_t>)
std::cout<<"int32"<<std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,uint32_t>)
std::cout<<"uint32"<<std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,int64_t>)
std::cout<<"int64"<<std::endl;
else if constexpr (std::is_same_v<std::underlying_type_t<TEnum>,uint64_t>)
std::cout<<"uint64"<<std::endl;
else
static_assert(false,"Unsupported enum type!");
}
int main(int argc,char *argv[])
{
TestEnum e {};
test<TestEnum>(e);
return EXIT_SUCCESS;
}
该程序在 Visual Studio 2017(使用 ISO C++17)中编译并运行良好,但最后一个else用红色下划线显示以下消息:
期待一个声明
在第 12 行的“void test(TEnum v) [with TEnum=TestEnum]”实例化期间检测到
(我试过使用else constexpr而不是else,但这似乎并不重要。)
如果我删除最后一个else if -branch (检查uint64_t的那个),错误就会消失:
这是 Visual Studio 中的错误,还是我做了不应该做的事情?