shared_ptr 别名构造函数的原型(prototype),形式为 g++:
template<typename _Yp>
shared_ptr(const shared_ptr<_Yp>& __r, element_type* __p) noexcept
: __shared_ptr<_Tp>(__r, __p) { }
这里给出的例子是:
shared_ptr< pair<int,int> > pii(new pair<int,int>());
shared_ptr<int> pi(pii, &pii->first);
行得通;一直有效。但是看看原型(prototype),_Yp 是我们提供的用于实例化模板的模板参数,因此上面的最后一行感觉应该是:
shared_ptr<pair> pi(pii, &pii->first);
但是这个例子绝对是是正确的。那么我们如何解释呢?我今天第一次看原型(prototype),我试图理解如何解释它。感谢您的评论/解释。
最佳答案
您混淆了不同的模板参数/参数。 _Yp
不是我们正在实例化 shared_ptr
的模板参数和。整体参数shared_ptr
GCC 实现中的模板称为 _Tp
, 不是 _Yp
.里面shared_ptr
那_Tp
也称为 element_type
.
与此同时,_Yp
是嵌套的成员模板的参数,它是构造函数模板。
shared_ptr
本身和它的构造函数模板是两个“正交”模板。 _Tp
和 _Yp
是两个独立且不相关的模板参数。
您没有(也不能)明确指定 _Yp
的参数.它会自动推导。但是您必须为 _Tp
指定参数,这正是您在示例中看到的
shared_ptr<int> pi(pii, &pii->first);
^ ^
| |
| The `_Yp` parameter is kinda/sorta implicitly present here.
| It parametrizes the constructor template. C++ has no syntax
| for specifying it explicitly
|
This is `_Tp`, not `_Yp`. `_Tp` parametrizes
the whole `shared_ptr` template
_Tp
在本例中指定为 int
,因为它应该是。 _Yp
从 pii
推导出来作为pair<int,int>
,完全符合您的预期。
关于c++ - 了解 shared_ptr 别名构造函数的原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48958192/