std::unique_ptr和std::shared_ptr是由c++最新标准c++11吸收的智能指针,定义在头文件<memory>中,关于这两个指针的具体操作和性质请查看具体文档,这里不做详述。
先来看下面这段代码:
#include<memory>
struct s;
struct base{
//std::unique_ptr<s> ps;//编译不过
std::shared_ptr<s> ps;
};
int main()
{
base b;
return 0;
}
s是一个不完全类型,当使用unique_ptr<s>进行实例化的时候,会产生编译错误,使用shared_ptr<s>则能通过编译。在C++11标准中有这段话:
ISO C++11
20.7.1.2.2
1 Requires: The expression get_deleter()(get()) shall be well formed, shall have well-defined behavior,
and shall not throw exceptions. [ Note: The use of default_delete requires T to be a complete type. —end note ]
也就是说包括unique_ptr的析构函数在内的一些操作要求具有完整类型。
C++标准库中大部分模板要求使用完全类型进行实例化,然而,shared_ptr 和 unique_ptr在某些情况下可以不满足这点。
下面这个表展示了unique_ptr和shared_ptr的成员函数是否需要一个完全类型参数。
注:表中”C”代表智能指针的成员需要一个完全类型参数,否则用”I”表示。”T”表示不会抛出异常。
Complete type rquirements for unique_ptr and shared_ptr | ||||
| unique_ptr | shared_ptr | ||
| I/C | noexcept | I/C | noexcept |
P() | I | T | I | T |
P(const P&) | N/A | N/A | I | T |
P(P&&) | I | T | I | T |
~P() | C | T | I | T |
P(A*) | I | T | C | F |
operator=(const P&) | N/A | N/A | I | T |
operator=(P&&) | C | T | I | T |
reset() | C | T | I | T |
reset(A*) | C | T | C | F |
由上表可以看出,对于unique_ptr和shared_ptr来说,任何需要指针转化的操作都需要完全类型参数。
reference:http://home.roadrunner.com/~hinnant/incomplete.html