std:: to_address
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<memory>
|
||
|
template
<
class
Ptr
>
constexpr auto to_address ( const Ptr & p ) noexcept ; |
(1) | (desde C++20) |
|
template
<
class
T
>
constexpr T * to_address ( T * p ) noexcept ; |
(2) | (desde C++20) |
Obtener la dirección representada por p sin formar una referencia al objeto apuntado por p .
T
es un tipo de función, el programa está mal formado. De lo contrario, devuelve
p
sin modificar.
Contenidos |
Parámetros
| p | - | puntero elegante o puntero crudo |
Valor de retorno
Puntero en bruto que representa la misma dirección que p representa.
Implementación posible
template<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->()); } |
Notas
std::to_address
puede utilizarse incluso cuando
p
no referencia almacenamiento que tenga un objeto construido en él, en cuyo caso
std::
addressof
(
*
p
)
no puede utilizarse porque no hay un objeto válido para que el parámetro de
std::
addressof
se vincule.
La sobrecarga de puntero sofisticado de
std::to_address
inspecciona la especialización
std::
pointer_traits
<
Ptr
>
. Si instanciar esa especialización es en sí mismo incorrecto (típicamente porque
element_type
no puede ser definido), eso resulta en un error grave fuera del contexto inmediato y hace que el programa sea incorrecto.
std::to_address
también puede utilizarse en iteradores que satisfacen
std::contiguous_iterator
.
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_to_address
|
201711L
|
(C++20) |
Utilidad para convertir un puntero a un puntero crudo (
std::to_address
)
|
Ejemplo
#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); }
Véase también
|
(C++11)
|
proporciona información sobre tipos similares a punteros
(plantilla de clase) |
|
[static]
(C++20)
(optional)
|
obtiene un puntero crudo desde un puntero sofisticado (inverso de
pointer_to
)
(función miembro estática pública de
std::pointer_traits<Ptr>
)
|