El std::to_address , introducido en C++20, se usa para obtener la dirección representada por el puntero especificado sin formar una referencia al apuntado. El std::addressof existente no puede hacer std::addressof(*ptr) porque *ptr no siempre es un objeto. El std::to_address nos resuelve estos problemas.
Sintaxis:
template class Ptr constexpr auto to_address(const Ptr& p) noexcept; template class T constexpr T* to_address(T* p) noexcept;
Parámetros: este método acepta un parámetro p que es el puntero elegante o sin procesar cuya dirección se debe encontrar.
Valor devuelto: Este método devuelve el puntero Raw que representa la dirección del puntero p.
Los siguientes ejemplos demuestran el uso de std::address
Ejemplo 1 :
// C++ code to show // the use of std::address #include <iostream> #include <memory> using namespace std; // Allocate memory and return // the pointer to that memory template <class A> auto allocator_new(A& a) { auto p = a.allocate(1); try { allocator_traits<A>::construct( a, to_address(p)); } catch (...) { a.deallocate(p, 1); throw; } cout << "Pointer to Memory allocated: " << p << endl; return p; } // Delete memory using // pointer to that memory template <class A> void allocator_delete( A& a, typename allocator_traits<A>::pointer p) { allocator_traits<A>::destroy( a, to_address(p)); a.deallocate(p, 1); cout << "Pointer to Memory deleted: " << p << endl; } // Driver code int main() { allocator<int> a; auto p = allocator_new(a); allocator_delete(a, p); }
Producción:
Pointer to Memory allocated: 0x1512c20 Pointer to Memory deleted: 0x1512c20
Ejemplo 2:
// C++ code to show // the use of std::address #include <iostream> #include <memory> using namespace std; int main() { // Make a unique pointer and // use to_address to get its address // from heap memory cout << "Using unique pointers\n\n"; auto ptr = make_unique<int>(15); cout << "Address of pointer to 15: " << to_address(ptr) << "\n"; auto ptr1 = make_unique<int>(17); cout << "Address of pointer to 17: " << to_address(ptr1) << "\n"; // Use to_address to get the // address of a dumb pointer // from stack memory cout << "\nUsing dumb pointers\n\n"; int i = 17; cout << "Address of pointer to 17: " << to_address(&i) << "\n"; int j = 18; cout << "Address of pointer to 18: " << to_address(&j) << "\n"; return 0; }
Producción:
Using unique pointers Address of pointer to 15: 0x181ec30 Address of pointer to 17: 0x181ec50 Using dumb pointers Address of pointer to 17: 0x7fff6b454398 Address of pointer to 18: 0x7fff6b45439c
Referencia: https://en.cppreference.com/w/cpp/memory/to_address