From cppreference.com
typenamestd::add_lvalue_reference<T>::typeoperator*()constnoexcept(noexcept(*std::declval<pointer>())); (1)(since C++11)
(constexpr since C++23)pointeroperator->()constnoexcept; (2)(since C++11)
(constexpr since C++23)operator* and operator-> provide access to the object owned by *this.
These member functions are only provided for unique_ptr for the single objects i.e. the primary template.
1) If std::reference_converts_from_temporary_v
<std::add_lvalue_reference_t<T>,
decltype(*std::declval<pointer>())> is true, the program is ill-formed.
(since C++23)If get() is a null pointer, the behavior is undefined.
Return value
1) Returns the object owned by *this, equivalent to *get().
2) Returns a pointer to the object owned by *this, i.e. get().
Exceptions
1) May throw if pointer has a throwing operator*.
Notes
The use of
is to make it possible to instantiate std::unique_ptr<void> since void& isn't allowed in C++ while std::add_lvalue_reference<void> produces void. See
for details.
Example
Run this code
#include<iostream>#include<memory>structFoo{voidbar(){std::cout<<"Foo::bar\n";}};voidf(constFoo&){std::cout<<"f(const Foo&)\n";}intmain(){std::unique_ptr<Foo>ptr(newFoo);ptr->bar();f(*ptr);}Output:
Foo::bar f(const Foo&) Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR Applied to Behavior as published Correct behavior
C++11 operator* might be potentially-throwing
even if *get() was noexcept added a conditional
exception specification
C++23 operator* could return a dangling reference if
element_type* differs from Deleter::pointerthe program is ill-
formed in this case See also
returns a pointer to the managed object
(public member function)