The following compiled with VS2015, but fails in VS2017 with the below errors. Was the code doing something non standard that has been fixed in VS2017, or should VS2017 compile
This is definitely a bug in Visual Studio. It compiles on GCC and Clang. It seems to be related with constexpr
functions evaluated as template parameters. As a temporary workaround, you can make a template variable:
template <typename T>
bool constexpr is_flags_v = IsFlags(T{});
template<typename E>
std::enable_if_t<is_flags_v<E>, std::underlying_type_t<E>> operator | (E lhs, E rhs)
{
return ToUnderlying(lhs) | ToUnderlying(rhs);
}
On Godbolt
This might be a bug in Visual Studio. A possible workaround could be using template specialization instead of overloading:
template <typename T>
struct is_flags { constexpr static bool value = false; };
template <>
struct is_flags<PlantFlags> { constexpr static bool value = true; };
template<typename E> std::enable_if_t<is_flags<E>::value, std::underlying_type_t<E >> operator | (E lhs, E rhs)
{
return ToUnderlying(lhs) | ToUnderlying(rhs);
}