https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104699
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- The std::is_array result is a consequence of the compiler not matching the is_array<T[N]> partial specialization for int[0]: using size_t = decltype(sizeof(0)); template<typename T> struct X { static constexpr bool value = false; }; template<typename T, size_t N> struct X<T[N]> { static constexpr bool value = true; }; static_assert( ! X<int[0]>::value ); GCC, Clang, Intel and MSVC all agree here: the int[0] type does not match the X<T[N]> partial specialization. I don't think it would be reasonable for the library to work differently, and I don't think it's reasonable to add kluges to make_shared to support creating an object of a type that should only exist as a subobject of some other object.