template< class Ptr >
constexpr auto to_address( const Ptr& p ) noexcept;
template< class T >
constexpr T* to_address( T* p ) noexcept;
Obtain the address represented by p without forming a reference to the object pointed to by p.
1) Fancy pointeroverload: If the expression
std::pointer_traits<Ptr>::to_address(p)is well-formed, returns the result of that expression. Otherwise, returns
std::to_address(p.operator->()).
2) Raw pointer overload: If T
is a function type, the program is ill-formed. Otherwise, returns p unmodified.
Raw pointer that represents the same address as p does.
[edit] Possible implementationtemplate<class T> constexpr T* to_address(T* p) noexcept { static_assert(!std::is_function_v<T>); return p; } template<class T> constexpr auto to_address(const T& p) noexcept { if constexpr (requires{ std::pointer_traits<T>::to_address(p); }) return std::pointer_traits<T>::to_address(p); else return std::to_address(p.operator->()); }[edit] Notes
std::to_address
can be used even when p does not reference storage that has an object constructed in it, in which case std::addressof(*p) cannot be used because there is no valid object for the parameter of std::addressof to bind to.
The fancy pointer overload of std::to_address
inspects the std::pointer_traits<Ptr> specialization. If instantiating that specialization is itself ill-formed (typically because element_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 satisfy std::contiguous_iterator.
#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, typename std::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); }[edit] See also provides information about pointer-like types
[static] (C++20)(optional)
obtains a raw pointer from a fancy pointer (inverse ofpointer_to
)
std::pointer_traits<Ptr>
) [edit]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4