http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59027
--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Marc Mutz from comment #0) > According to N3797 Table 49, both is_signed and is_unsigned should evaluate > to true_type only if the argument is_arithmetic, too. is_unsigned honours > this, but is_signed doesn't: Your own code shows this statement to be false. is_signed is false for your enumeration type, as required. is_unsigned is also false, as required. The text in your assertion is wrong: static_assert(!std::is_signed<MouseButton>::value, "Enum should be unsigned"); It is not true that enums should be unsigned, the traits say enums are neither signed nor unsigned, and that's what GCC does, as required: #include <type_traits> enum MouseButton { }; static_assert(!std::is_signed<MouseButton>::value, "Enum should be not be signed"); static_assert(!std::is_unsigned<MouseButton>::value, "Enum should not be unsigned");