【问题标题】:c++ smart pointer c'tor design explainationc++智能指针c'tor设计说明
【发布时间】:2021-12-15 03:33:10
【问题描述】:

当我阅读代码时:

    DefaultSPStorage() : pointee_(Default()) {}

    DefaultSPStorage(const DefaultSPStorage&) : pointee_(nullptr) {}

    template<class U>
    DefaultSPStorage(const DefaultSPStorage<U>) : pointee_(nullptr) {}

    explicit DefaultSPStorage(const StoredType& p) : pointee_(p) {}

我对第三个模板化 c'tor 感到困惑。

如果有人能告诉我这样做的目的,我将不胜感激。

【问题讨论】:

  • 请提供minimal reproducible example。然而,第三个构造函数看起来像一个转换构造函数(可以与另一个持有任何指针的智能指针一起使用)。然而,这两个复制构造函数似乎都没有复制任何东西。这就是我会感到困惑的地方。如果不打算复制构造,我会删除这些构造函数以防止意外使用......(但是,也许,它的上下文太少了,无法证明这一点。)
  • 你应该至少提供类声明

标签: c++ pointers templates


【解决方案1】:

DefaultSPStorage()是一个模板类,例如:

template<typename T>
class DefaultSPStorage
{
    ...
};

第三个模板化构造函数采用DefaultSPStorage&lt;U&gt; 实例,其模板参数可以不同于正在构造的DefaultSPStorage 实例。

IOW,这允许使用DefaultSPStorage&lt;B&gt; 作为输入来构造DefaultSPStorage&lt;A&gt;,例如:

DefaultSPStorage<short> a;
DefaultSPStorage<int> b(a);

【讨论】:

  • 是的,但是另外,您能不能也请教一下这个模板c'tor的一些用例
  • @Edee 以std::unique_ptr 为例。它有一个模板构造函数,它允许从另一个std::unique_ptr&lt;U&gt; 构造(即转移所有权)std::unique_ptr&lt;T&gt;,其中U 派生自T,因此U* 可以隐式转换为T*
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 2011-08-12
  • 2011-04-22
相关资源
最近更新 更多