Namespaces
Variants

std::unique_ptr<T,Deleter>:: operator*, std::unique_ptr<T,Deleter>:: operator->

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
typename std:: add_lvalue_reference < T > :: type operator * ( ) const
noexcept ( noexcept ( * std:: declval < pointer > ( ) ) ) ;
(1) (начиная с C++11)
(constexpr начиная с C++23)
pointer operator - > ( ) const noexcept ;
(2) (начиная с C++11)
(constexpr начиная с C++23)

operator * и operator - > предоставляют доступ к объекту, которым владеет * this .

Эти функции-члены предоставляются только для unique_ptr для одиночных объектов, то есть для основной шаблонной специализации.

1) Если std :: reference_converts_from_temporary_v
< std:: add_lvalue_reference_t < T > ,
decltype ( * std:: declval < pointer > ( ) ) >
равно true , программа является некорректной.
(начиная с C++23)

Если get ( ) является нулевым указателем, поведение не определено.

Содержание

Возвращаемое значение

1) Возвращает объект, принадлежащий * this , эквивалентно * get ( ) .
2) Возвращает указатель на объект, принадлежащий * this , т.е. get ( ) .

Исключения

1) Может генерировать исключение, если pointer имеет бросающий operator * .

Примечания

Использование std::add_lvalue_reference позволяет инстанцировать std:: unique_ptr < void > , поскольку void & не допускается в C++, тогда как std:: add_lvalue_reference < void > порождает void . Подробности см. в LWG673 .

Пример

#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);
}

Вывод:

Foo::bar
f(const Foo&)

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2762 C++11 operator * может потенциально генерировать исключения
даже если * get ( ) был noexcept
добавлено условное
спецификация исключений
LWG 4148 C++23 operator * может возвращать висячую ссылку, если
element_type* отличается от Deleter::pointer
программа является некорректной
в этом случае

Смотрите также

возвращает указатель на управляемый объект
(публичная функция-член)