我想在编译时检查各种枚举是否包含给定的值,所以我写了以下内容:
#include <optional>
enum class test_enum : int {
VALUE_0 = 0,
VALUE_1 = 1
};
// Template function to perform check
template<typename T>
constexpr std::optional<T> from_int(int value)
{
static_assert(false, __FUNCTION__ " not implemented for this type; see build output");
return std::optional<T>();
}
// Specialization for test_enum
template<>
constexpr std::optional<test_enum> from_int(int value)
{
switch (value) {
case static_cast<int>(test_enum::VALUE_0) :
return test_enum::VALUE_0;
case static_cast<int>(test_enum::VALUE_1):
return test_enum::VALUE_1;
default:
return std::optional<test_enum>();
}
}
int main(int argc, char* argv[])
{
static_assert(from_int<test_enum>(1));
return 0;
}
使用 Visual Studio 2017(版本 15.8.6),代码编译成功,输出中没有错误。但是,错误窗口显示
E0028: expression must have a constant value" at line 30. (the first line of main)
和
"std::_Optional_construct_base<test_enum>::_Optional_construct_base(std::in_place_t, _Types &&..._Args) [with _Types=<test_enum>]" (declared implicitly) is not defined)".
关于为什么会这样的任何提示?我可以忽略 E0028,但如果可能的话,我不希望这样做。
编辑:从 from_int 中删除 static_assert 不会改变错误。