std:: to_address
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definiert im Header
<memory>
|
||
|
template
<
class
Ptr
>
constexpr auto to_address ( const Ptr & p ) noexcept ; |
(1) | (seit C++20) |
|
template
<
class
T
>
constexpr T * to_address ( T * p ) noexcept ; |
(2) | (seit C++20) |
Erhalten Sie die durch p repräsentierte Adresse, ohne eine Referenz auf das von p gezeigte Objekt zu bilden.
T
ein Funktionstyp ist, ist das Programm fehlerhaft. Andernfalls gibt
p
unverändert zurück.
Inhaltsverzeichnis |
Parameter
| p | - | fancy oder raw pointer |
Rückgabewert
Roher Zeiger, der dieselbe Adresse repräsentiert wie p es tut.
Mögliche Implementierung
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->()); } |
Hinweise
std::to_address
kann sogar verwendet werden, wenn
p
nicht auf Speicher verweist, in dem ein Objekt konstruiert wurde. In diesem Fall kann
std::
addressof
(
*
p
)
nicht verwendet werden, da kein gültiges Objekt für den Parameter von
std::
addressof
vorhanden ist, an das gebunden werden könnte.
Die spezielle Überladung für ausgefallene Zeiger von
std::to_address
untersucht die
std::
pointer_traits
<
Ptr
>
Spezialisierung. Falls die Instanziierung dieser Spezialisierung selbst fehlerhaft ist (typischerweise weil
element_type
nicht definiert werden kann), führt dies zu einem schwerwiegenden Fehler außerhalb des unmittelbaren Kontexts und macht das Programm fehlerhaft.
std::to_address
kann zusätzlich auf Iteratoren verwendet werden, die
std::contiguous_iterator
erfüllen.
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_to_address
|
201711L
|
(C++20) |
Utility zur Konvertierung eines Zeigers in einen Rohzeiger (
std::to_address
)
|
Beispiel
#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); }
Siehe auch
|
(C++11)
|
stellt Informationen über zeigerähnliche Typen bereit
(Klassentemplate) |
|
[static]
(C++20)
(optional)
|
ermittelt einen Rohzeiger aus einem Fancy Pointer (Umkehrung von
pointer_to
)
(öffentliche statische Elementfunktion von
std::pointer_traits<Ptr>
)
|