|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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] |