std::unique_ptr<T,Deleter>:: operator*, std::unique_ptr<T,Deleter>:: operator->
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
|
unique_ptr::operator*
unique_ptr::operator->
|
||||
| Non-member functions | ||||
|
(C++14)
(C++20)
|
||||
|
(until C++20)
(C++20)
|
||||
|
(C++20)
|
||||
| Helper classes | ||||
|
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 ( ) является нулевым указателем, поведение не определено.
Содержание |
Возвращаемое значение
Исключения
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
|
программа является некорректной
в этом случае |
Смотрите также
|
возвращает указатель на управляемый объект
(публичная функция-член) |