Files
cppdraft_translate/cppdraft/pointer/traits.md
2025-10-25 03:02:53 +03:00

6.5 KiB
Raw Blame History

[pointer.traits]

20 Memory management library [mem]

20.2 Memory [memory]

20.2.3 Pointer traits [pointer.traits]

20.2.3.1 General [pointer.traits.general]

1

#

The class template pointer_traits supplies a uniform interface to certain attributes of pointer-like types.

🔗

namespace std {template struct pointer_traits {see below; }; template struct pointer_traits<T*> {using pointer = T*; using element_type = T; using difference_type = ptrdiff_t; template using rebind = U*; static constexpr pointer pointer_to(see below r) noexcept; };}

20.2.3.2 Member types [pointer.traits.types]

1

#

The definitions in this subclause make use of the following exposition-only class template and concept:templatestruct ptr-traits-elem // exposition only{ };

template requires requires { typename T::element_type; }struct ptr-traits-elem{ 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; };

templateconcept has-elem-type = // exposition onlyrequires { typename ptr-traits-elem::type; }

2

#

If Ptr satisfies has-elem-type, a specialization pointer_traits 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;

3

#

Type: Ptr.

🔗

using element_type = see below;

4

#

Type: typename ptr-traits-elem::type.

🔗

using difference_type = see below;

5

#

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;

6

#

Alias template: Ptr::rebind if the qualified-id Ptr::rebind 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.

20.2.3.3 Member functions [pointer.traits.functions]

🔗

static pointer pointer_traits::pointer_to(see below r); static constexpr pointer pointer_traits<T*>::pointer_to(see below r) noexcept;

1

#

Mandates: For the first member function,Ptr::pointer_to(r) is well-formed.

2

#

Preconditions: For the first member function,Ptr::pointer_to(r) returns a pointer to r through which indirection is valid.

3

#

Returns: The first member function returns Ptr::pointer_to(r).

The second member function returns addressof(r).

4

#

Remarks: If element_type is cv void, the type ofr is unspecified; otherwise, it is element_type&.

20.2.3.4 Optional members [pointer.traits.optmem]

1

#

Specializations of pointer_traits may define the member declared in this subclause to customize the behavior of the standard library.

A specialization generated from the pointer_traits primary template has no member by this name.

🔗

static element_type* to_address(pointer p) noexcept;

2

#

Returns: A pointer of type element_type* that references the same location as the argument p.

3

#

[Note 1:

This function is intended to be the inverse of pointer_to.

If defined, it customizes the behavior of the non-member functionto_address ([pointer.conversion]).

— end note]