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

标签 c++ c++11

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/

相关文章:

c++ - 我想知道 C++ 中的延迟函数

c++ - 修改const shared_ptr&传递的数据可以吗?

C++11 可变参数模板函数——错误在哪里?

c++ - string pop_back 是如何在常数时间内实现的?

c++ - 在 Linux C++ 中获取 PTY 的最简单方法

c++ - 无法为 read_graphviz() 示例链接 Boost Graph Library

c++ - 在 C++ 中访问 protected 成员函数

c++ - 使用 C++ Win32 API 启用视觉样式?

c++ - 可变模板类构造函数

c++ - 如何在 C++ 中为二维 vector 做构造函数?