https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71579
--- Comment #2 from Antony Polukhin <antoshkka at gmail dot com> --- You are right. But those wrong usages are simple to catch and a static_assert with a readable message would be a huge help for users: template <class T> struct assert_complete { typedef char yes_type; struct no_type { char data[10]; }; template <class U> static yes_type test(std::integral_constant<std::size_t, sizeof(U)>* = 0); template <class U> static no_type test(...); static_assert(sizeof(test<T>(0)) == sizeof(yes_type), "T must be a complete type"); }; // ... template<typename _Tp, typename... _Args> struct is_constructible : public __is_constructible_impl<_Tp, _Args...>::type { static constexpr assert_complete<_Tp> _complete{}; }; Now user will get a nice error message: main.cpp: In instantiation of 'struct assert_complete<foo>': main.cpp:16:10: required from 'struct is_constructible<foo, foo>' main.cpp:25:31: required from here main.cpp:12:5: error: static assertion failed: T must be a complete type