std::unique_ptr<T,Deleter>::operator*, std::unique_ptr<T,Deleter>::operator->
Von cppreference.com
< cpp | memory | unique ptr
typename std::add_lvalue_reference<T>::type operator*() const noexcept(noexcept(*std::declval<pointer>())); |
(1) | (seit C++11) (constexpr seit C++23) |
pointer operator->() const noexcept; |
(2) | (seit C++11) (constexpr seit C++23) |
operator* und operator-> bieten Zugriff auf das von *this verwaltete Objekt.
Diese Memberfunktionen werden nur für unique_ptr für einzelne Objekte, d. h. die primäre Vorlage, bereitgestellt.
|
1) Wenn std::reference_converts_from_temporary_v
<std::add_lvalue_reference_t<T>, decltype(*std::declval<pointer>())> true ist, ist das Programm fehlerhaft. |
(seit C++23) |
Wenn get() ein Nullzeiger ist, ist das Verhalten undefiniert.
Inhalt |
[bearbeiten] Rückgabewert
1) Gibt das von *this verwaltete Objekt zurück, äquivalent zu *get().
2) Gibt einen Zeiger auf das von *this verwaltete Objekt zurück, d. h. get().
[bearbeiten] Ausnahmen
1) Kann auslösen, wenn
pointer einen auslösenden operator* hat.[bearbeiten] Hinweise
Die Verwendung von std::add_lvalue_reference ermöglicht die Instanziierung von std::unique_ptr<void>, da void& in C++ nicht zulässig ist, während std::add_lvalue_reference<void> void erzeugt. Siehe LWG673 für Details.
[bearbeiten] Beispiel
Führen Sie diesen Code aus
#include <iostream> #include <memory> struct Foo { void bar() { std::cout << "Foo::bar\n"; } }; void f(const Foo&) { std::cout << "f(const Foo&)\n"; } int main() { std::unique_ptr<Foo> ptr(new Foo); ptr->bar(); f(*ptr); }
Ausgabe
Foo::bar f(const Foo&)
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2762 | C++11 | operator* kann potenziell auslösen auch wenn *get() noexcept war |
eine bedingte Ausnahmespezifikation hinzugefügt |
| LWG 4148 | C++23 | operator* könnte eine hängende Referenz zurückgeben, wennelement_type* sich von Deleter::pointer unterscheidet |
das Programm ist schlecht ge- formt in diesem Fall |
[bearbeiten] Siehe auch
| Gibt einen Zeiger auf das verwaltete Objekt zurück (öffentliche Memberfunktion) |