如何理解 unique_ptr 的定义?(uniqueptr move)

2023-08-08 13:25:53

 

@菜鸡SHP
,评论区编辑不方便,又没法贴图,我自己占一个回答吧:

我发觉要理解这个代码,先得理解 enable_if, 我刚在 enable_if - C++ Reference 找到例子代码;

又发觉要理解这个例子代码方法1里面的typename 关键字,得看 c++类模板template中的typename使用方法-超级棒 - 唯一诺 - 博客园 , 我把typename 删了,就报错:

然后关键是 enable_if 例子代码里 使用方法2 的那种形式,把class 关键字换成同意的typename关键字后就和下图unique_ptr 定义中 constructors 上

template<typename _Del = _Dp, typename = _DeleterConstraint<_Del>>

形式类似

到目前为止,我一直对 typename = blabla 这种形式很不解,哪里有讲c++ template 语法的讲这个的?

template<typename T>

template<typename T=某个具体类名>

这都好理解,但

template<typename T, typename=blabla>

是啥?

更新:我发现了这样的提示:

然后搜到了 Anonymous template typename/class declarations , 说是定义匿名模板参数,就是为了强调这个参数不被引用。

既然这个匿名模板参数接下来不会被使用,如同

@菜鸡SHP
在问题评论区所说,其定义只是为了让编译器去计算下 enable_if 第一个参数里的布尔表达式,如果这个布尔值返回真, enable_if<true>::type 得到的是void, 这个就是匿名模板参数的值,因为不被使用,所以得到啥值都无所谓。所以在 __uniq_ptr_impl 类里, enable_if 只要传入一个参数就可以了,不用带第二个参数.但我觉得如果要是像下面这样再带个 _Dp 参数也不会错,无非就是把 _Dp 值给了匿名模板参数,而不是void:

using _DeleterConstraint = enable_if<

__and_<__not_<is_pointer<_Dp>>,

is_default_constructible<_Dp>>::value, _Dp>;

另外,估计也是因为 unique_ptr 里 _DeleterConstrain 定义等号右边已经包含了 typename 关键字,否则如我刚才测试,会出现 typename = typename blabla 这样的奇怪语法:登录 - Gitee.com


以上就是关于《如何理解 unique_ptr 的定义?(uniqueptr move)》的全部内容,本文网址:https://www.7ca.cn/baike/60664.shtml,如对您有帮助可以分享给好友,谢谢。
标签:
声明

排行榜