[pointer.traits.types] (original) (raw)

20 Memory management library [mem]

20.2 Memory [memory]

20.2.3 Pointer traits [pointer.traits]

20.2.3.2 Member types [pointer.traits.types]

The definitions in this subclause make use of the following exposition-only class template and concept:template<class T> struct ptr-traits-elem { };template<class T> requires requires { typename T::element_type; } struct ptr-traits-elem<T> { using type = typename T::element_type; };template<template<class...> class SomePointer, class T, class... Args> requires (!requires { typename SomePointer<T, Args...>::element_type; }) struct ptr-traits-elem<SomePointer<T, Args...>> { using type = T; };template<class Ptr> concept has-elem-type = requires { typename ptr-traits-elem<Ptr>::type; }

If Ptr satisfies has-elem-type, a specialization pointer_traits<Ptr>generated from the pointer_traits primary template has the following members as well as those described in [pointer.traits.functions]; otherwise, such a specialization has no members by any of those names.

using pointer = _see below_;

using element_type = _see below_;

Type: typename ptr-traits-elem<Ptr>​::​type.

using difference_type = _see below_;

Type: Ptr​::​difference_type if the qualified-id Ptr​::​difference_type is valid and denotes a type ([temp.deduct]); otherwise,ptrdiff_t.

template<class U> using rebind = _see below_;

Alias template: Ptr​::​rebind<U> if the qualified-id Ptr​::​rebind<U> is valid and denotes a type ([temp.deduct]); otherwise,SomePointer<U, Args> ifPtr is a class template instantiation of the form SomePointer<T, Args>, where Args is zero or more type arguments; otherwise, the instantiation ofrebind is ill-formed.