我有一个函数 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 分支(检查 uint64_t 的分支),则错误消失:
这是Visual Studio中的bug,还是我不应该做的事情?
答案 0 :(得分:1)
我确定这实际上不是您期望的答案,但是… 这段代码
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;
}
不发出任何警告
但是
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;
}
产生与您的第一个屏幕截图相同的消息。我知道它是法语,但请相信我说的也是一样。
仅仅为了辩论,我从未真正理解过为什么规范仍然允许
if(boolean) do;
同时
if(boolean) { do;}
做这项工作,没有任何歧义。当然,Fortran 77允许的内容是肮脏的。坦白地说,40年已经过去了,如果我们不得不再添加两个字符,我们就不会大叫。。。我不是...
答案 1 :(得分:0)
这似乎是IntelliSense中的错误。它与uint64_t
或任何其他类型无关。高于8个if / else分支的所有内容开始产生此错误。随时向Microsoft报告