https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114400
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- Oops, that was meant to be: #ifdef __cpp_lib_type_identity // C++ >= 20 /** * Identity metafunction. * @since C++20 * @{ */ template<typename _Tp> struct type_identity { using type = _Tp; }; template<typename _Tp> using type_identity_t = typename type_identity<_Tp>::type; /// @} template<typename _Tp> using __type_identity = type_identity<_Tp>; template<typename _Tp> using __type_identity_t = type_identity_t<_Tp>; #else /// @cond undocumented template <typename _Type> using __type_identity { using type = _Type; }; template<typename _Tp> using __type_identity_t = typename __type_identity<_Tp>::type; #endif But that messes up the @cond / @endcond nesting. Anyway, something like that.