# Type traits intrinsic design

This is a survey of the type traits intrinsics clang has, and those needed. The names and definitions of several of the needed type traits has recently changed. Please see: N3142.

> Legend
> clang supplies it and it is absolutely necessary | `some_trait(T)`
> clang supplies it and it is useful | `some_trait(T)`
> clang supplies it and it is not needed | `some_trait(T)`
> clang does not supply it and it is not needed |
> clang does not supply it and it is absolutely necessary | `some_trait(T)`

> Needed type traits vs clang type traits
> libc++ Needs | clang Has
> --- | ---
> `is_union<T>` | `__is_union(T)`
> `is_class<T>` | `__is_class(T)`
> `is_enum<T>` | `__is_enum(T)`
> `is_pod<T>` | `__is_pod(T)`
> `has_virtual_destructor<T>` | `__has_virtual_destructor(T)`
> `is_constructible<T, Args...>` |
> `is_default_constructible<T>` |
> `is_copy_constructible<T>` |
> `is_move_constructible<T>` |
> `is_assignable<T, U>` |
> `is_copy_assignable<T>` |
> `is_move_assignable<T>` |
> `is_destructible<T>` |
> `is_trivially_constructible<T, Args...>` | `__is_trivially_constructible(T, U)`
> `is_trivially_default_constructible<T>` | `__has_trivial_constructor(T)`
> `is_trivially_copy_constructible<T>` | `__has_trivial_copy(T)`
> `is_trivially_move_constructible<T>` |
> `is_trivially_assignable<T, U>` | `__is_trivially_assignable(T, U)`
> `is_trivially_copy_assignable<T>` | `__has_trivial_assign(T)`
> `is_trivially_move_assignable<T>` |
> `is_trivially_destructible<T>` | `__has_trivial_destructor(T)`
> `is_nothrow_constructible<T, Args...>` |
> `is_nothrow_default_constructible<T>` | `__has_nothrow_constructor(T)`
> `is_nothrow_copy_constructible<T>` | `__has_nothrow_copy(T)`
> `is_nothrow_move_constructible<T>` |
> `is_nothrow_assignable<T, U>` |
> `is_nothrow_copy_assignable<T>` | `__has_nothrow_assign(T)`
> `is_nothrow_move_assignable<T>` |
> `is_nothrow_destructible<T>` |
> `is_trivial<T>` | `__is_trivial(T)`
> `is_trivially_copyable<T>` | `__is_trivially_copyable(T)`
> `is_standard_layout<T>` | `__is_standard_layout(T)`
> `is_literal_type<T>` | `__is_literal_type(T)`
> `is_convertible<T, U>` | `__is_convertible_to(T, U)`
> `is_base_of<T, U>` | `__is_base_of(T, U)`
> `underlying_type<T>` | `__underlying_type(T)`
> `is_polymorphic<T>` | `__is_polymorphic(T)`
> `is_empty<T>` | `__is_empty(T)`
> `is_abstract<T>` | `__is_abstract(T)`