std::unique_ptr<T,Deleter>::operator*, std::unique_ptr<T,Deleter>::operator->
来自cppreference.com
| (1) | (C++11 起) (C++23 起为 constexpr) |
|
| (2) | (C++11 起) (C++23 起为 constexpr) |
|
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>,因为 C++ 不允许 void& 而 std::add_lvalue_reference<void> 产生的是 void。详情见 LWG673。
示例
Run this code
#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 | 即使 *get() 是 noexcept 的,operator* 仍可能会潜在抛出
|
添加了条件性异常说明 |
| LWG 4148 | C++23 | element_type* 与 Deleter::pointer 不同的情况下 operator* 可能会返回悬垂引用
|
此时程序非良构 |
参阅
| 返回指向被管理对象的指针 (公开成员函数) |