定义于头文件
template< class T, class Deleter = std::default_delete>
class unique_ptr; (1) (C++11 起)
template < class T,class Deleter>
class unique_ptr; (2) (C++11 起)
std::unique_ptr::get
pointer get() const noexcept; (C++11 起)
返回指向被管理对象的指针,如果无被管理对象,则为 nullptr 。
(无)
指向被管理对象的指针,无被管理对象,则为 nullptr 。
#include
#include
#include
int main()
{
std::unique_ptr s_p(new std::string("Hello, world!"));
std::string *s = s_p.get();
std::cout << *s << '\n';
}
std::unique_ptr::get_deleter
Deleter& get_deleter() noexcept; (C++11 起)
const Deleter& get_deleter() const noexcept; (C++11 起)
返回会用于析构被管理对象的删除器对象。
(无)
存储的删除器对象。
#include
#include
struct Foo
{
Foo()
{
std::cout << "Foo...\n";
}
~Foo()
{
std::cout << "~Foo...\n";
}
};
struct D
{
void bar()
{
std::cout << "Call deleter D::bar()...\n";
}
void operator()(Foo* p) const
{
std::cout << "Call delete for Foo object...\n";
delete p;
}
};
int main()
{
std::unique_ptr up(new Foo(), D());
D& del = up.get_deleter();
del.bar();
}
std::unique_ptr::operator bool
explicit operator bool() const noexcept; (C++11 起)
检查 *this 是否占有对象,即是否有 get() != nullptr 。
(无)
若 *this 占有对象则为 true ,否则为 false 。
#include
#include
int main()
{
std::unique_ptr ptr(new int(42));
if (ptr)
{
std::cout << "before reset, ptr is: " << *ptr << '\n';
}
ptr.reset();
if (ptr)
{
std::cout << "after reset, ptr is: " << *ptr << '\n';
}
}
std::unique_ptr::operator*
typename std::add_lvalue_reference::type operator*() const; (1) (C++11 起)
pointer operator->() const noexcept; (2) (C++11 起)
operator*
与 operator->
提供到 *this 所占有的对象的访问。
若 get() == nullptr 则行为未定义。
(无)
1) 返回 *this 所占有的对象,等价于 *get() 。
2) 返回指向 *this 所占有对象的指针,即 get() 。
1) 可能抛出,例如若 pointer
定义抛出的 operator*
调用示例
#include
#include
struct Foo
{
void bar() const
{
std::cout << "Foo::bar\n";
}
};
void f(const Foo& foo)
{
foo.bar();
std::cout << "f(const Foo&)\n";
}
int main()
{
std::unique_ptr ptr(new Foo);
ptr->bar();
f(*ptr);
}
std::unique_ptr::operator[]
T& operator[](size_t i) const; (C++11 起)
operator[]
提供对 unique_ptr
所管理的数组元素的访问。
参数 i
必须小于数组中的元素数;否则行为未定义。
i | - | 要返回的元素的索引 |
返回在索引 i
的元素,即 get()[i] 。
#include
#include
int main()
{
const int size = 10;
std::unique_ptr fact(new int[size]);
for (int i = 0; i < size; ++i)
{
fact[i] = (i == 0) ? 1 : i * fact[i - 1];
}
for (int i = 0; i < size; ++i)
{
std::cout << i << ": " << fact[i] << '\n';
}
}