https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83134
Bug ID: 83134 Summary: std::negation uses !B::value instead of !bool(B::value) Product: gcc Version: 7.2.1 Status: UNCONFIRMED Keywords: rejects-valid Severity: normal Priority: P3 Component: libstdc++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- #include <type_traits> struct X { constexpr operator bool() const { return false; } constexpr bool operator!() const = delete; }; struct Y { static constexpr X value{}; }; int main() { static_assert(std::negation<Y>::value); } In file included from neg.cc:1:0: /home/jwakely/gcc/8/include/c++/8.0.0/type_traits: In instantiation of ‘struct std::__not_<Y>’: /home/jwakely/gcc/8/include/c++/8.0.0/type_traits:172:12: required from ‘struct std::negation<Y>’ neg.cc:13:33: required from here /home/jwakely/gcc/8/include/c++/8.0.0/type_traits:154:38: error: use of deleted function ‘constexpr bool X::operator!() const’ : public integral_constant<bool, !_Pp::value> ^~~~ neg.cc:5:18: note: declared here constexpr bool operator!() const = delete; ^~~~~~~~ neg.cc: In function ‘int main()’: neg.cc:13:35: error: ‘value’ is not a member of ‘std::negation<Y>’ static_assert(std::negation<Y>::value); ^~~~~