https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92735
--- Comment #4 from Marc Pawlowsky <marcpawl at gmail dot com> --- (In reply to Jonathan Wakely from comment #2) > For the case reported here, Clang and EDG do reject it, but I'm not yet > convinced GCC is wrong to accept it. > > The implicit instantiation of is_Foo<Bad> causes: > > "the implicit instantiation of the declarations, but not of the definitions, > of the non-deleted class member functions, member classes, scoped member > enumerations, static data members, member templates, and friends;" > > and: > > "in particular, the initialization (and any associated side effects) of a > static data member does not occur unless the static data member is itself > used in a way that requires the definition of the static data member to > exist." > > Nothing requires the instantiation of is_Foo<Bad>::hello. FYI, Forcing the use of hello does cause a compile time error. template <typename T> struct is_Foo { using hello_fn_t = void (T::*)(int); constexpr static void (T::*hello)(int) = &T::hello; static constexpr bool value=(!!hello); }; source>:16:46: error: 'hello' is not a member of 'Bad' 16 | constexpr static void (T::*hello)(int) = &T::hello;