https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95143
--- Comment #6 from Bernd Baumanns <familiebaumanns at gmail dot com> --- simplified source (without include type_traits): ---------------------------- class false_type { public: static constexpr bool value = false; }; class true_type{ public: static constexpr bool value = true; }; template<class T> T&& declval() noexcept; template<typename T, typename U, typename = U> struct is_static_castable : false_type {}; template<typename T, typename U> struct is_static_castable<T, U, decltype(static_cast<U>(declval<T>()))> : true_type {}; class Base {}; struct A {}; class B: public Base {}; int main() { constexpr auto canCast = is_static_castable<A, B>::value; static_assert(!canCast); constexpr auto canCast2 = is_static_castable<A, A>::value; static_assert(canCast2); return 0; }