gpt4 book ai didi

c++ - 了解 shared_ptr 别名构造函数的原型(prototype)

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:55 24 4
gpt4 key购买 nike

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 ,因为它应该是。 _Yppii 推导出来作为pair<int,int> ,完全符合您的预期。

关于c++ - 了解 shared_ptr 别名构造函数的原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48958192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com