Spec-Zone.ru › C++

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

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++.

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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/unique_ptr/operator*

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API