shared_ptr / unique_ptr不完全类型

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_ptrshared_ptr的成员函数是否需要一个完全类型参数。

注:表中”C”代表智能指针的成员需要一个完全类型参数,否则用”I”表示。”T”表示不会抛出异常。

Complete type rquirements for unique_ptr and shared_ptr

 

unique_ptr

shared_ptr

 

I/C

noexcept

I/C

noexcept

P()
default constructor

I

T

I

T

P(const P&)
copy constructor

N/A

N/A

I

T

P(P&&)
move constructor

I

T

I

T

~P()
destructor

C

T

I

T

P(A*)

I

T

C

F

operator=(const P&)
copy assignment

N/A

N/A

I

T

operator=(P&&)
move assignment

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值