|
|
Defined in header <memory> | ||
template<class Ptr> constexprauto to_address(const Ptr& p)noexcept; | (1) | (since C++20) |
template<class T> constexpr T* to_address( T* p)noexcept; | (2) | (since C++20) |
Obtain the address represented byp without forming a reference to the object pointed to byp.
T
is a function type, the program is ill-formed. Otherwise, returnsp unmodified.Contents |
p | - | fancy or raw pointer |
Raw pointer that represents the same address asp does.
template<class T>constexpr T* to_address(T* p)noexcept{ static_assert(!std::is_function_v<T>);return p;} template<class T>constexprauto to_address(const T& p)noexcept{ifconstexpr(requires{std::pointer_traits<T>::to_address(p);})returnstd::pointer_traits<T>::to_address(p);elsereturn std::to_address(p.operator->());} |
std::to_address
can be used even whenp does not reference storage that has an object constructed in it, in which casestd::addressof(*p) cannot be used because there is no valid object for the parameter ofstd::addressof to bind to.
The fancy pointer overload ofstd::to_address
inspects thestd::pointer_traits<Ptr> specialization. If instantiating that specialization is itself ill-formed (typically becauseelement_type
cannot be defined), that results in a hard error outside the immediate context and renders the program ill-formed.
std::to_address
may additionally be used on iterators that satisfystd::contiguous_iterator.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_to_address | 201711L | (C++20) | Utility to convert a pointer to a raw pointer (std::to_address ) |
#include <memory> template<class A>auto allocator_new(A& a){auto p= a.allocate(1);try{std::allocator_traits<A>::construct(a, std::to_address(p));}catch(...){ a.deallocate(p,1);throw;}return p;} template<class A>void allocator_delete(A& a,typenamestd::allocator_traits<A>::pointer p){std::allocator_traits<A>::destroy(a, std::to_address(p)); a.deallocate(p,1);} int main(){std::allocator<int> a;auto p= allocator_new(a); allocator_delete(a, p);}
(C++11) | provides information about pointer-like types (class template)[edit] |
[static](C++20)(optional) | obtains a raw pointer from a fancy pointer (inverse ofpointer_to )(public static member function of std::pointer_traits<Ptr> )[edit] |