[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.