unique_ptr 包含 unique_ptr

unique_ptr that contains unique_ptr

免责声明:我最初写了一个我认为很清楚的问题版本,但事实并非如此。我在这里将其重新设计为 MRE。

我有以下代码:

#include <map>
#include <memory>
#include <string>

using std::make_unique;
using std::string;
using std::unique_ptr;

template <typename T>
class Holder {
   public:
    Holder() {}
    ~Holder() {}
   private:
    T value_;  // In real life, we can do something with this.
};

struct Thing {
    Thing() {}
};
class ThingCollection {
   public:
    ThingCollection() {}

   private:
    // In real life, I have more maps of <string, Thing*>.
    // Which is why I use a unique_ptr in the map.
    std::map<string, unique_ptr<Thing>> the_map_;
};

我的问题是将 unique_ptr 转换为 Holder<ThingCollection>,由于缺少复制构造函数而失败。

void foo() {
    Holder<ThingCollection> cm;  // OK.
    auto cmp1 = make_unique<Holder<int>>(Holder<int>());  // OK.
    auto cmp2 = make_unique<ThingCollection>(ThingCollection());    // OK.
    auto cmp3 = make_unique<Holder<int>>(Holder<int>()); // OK.
    auto cmp4 = make_unique<Holder<ThingCollection>>(Holder<ThingCollection>()); // BAD.

}

编译时,最后一行 (BAD) 由于隐式删除了一个复制构造函数(unique_ptr)而失败。我明白为什么unique_ptr不能复制,但我不明白为什么它要复制到这里或者正确的反应是什么。

我是这样编译的:

clang++ -std=c++14 -pthread -Wall -Wextra -c -o mre.o mre.cc

This, of course, leads to errors about implicitly-deleted copy constructors. I think I understand why this is so

当您尝试复制具有不可复制成员的类型的对象时,通常会遇到此类错误。

解决方案:不要尝试复制不可复制的对象。


Disclaimer: Obviously a unique_ptr can't manage something that itself contains a unique_ptr, at least not in any naive way.

相反,unique pointer可以很方便的管理一些本身就包含unique pointer的东西。我能想到的唯一一种天真的方法会失败的情况是当指针形成一个递归链——本质上是一个链表——在这种情况下你需要一个自定义的析构函数来避免线性递归深度。

P.S。我建议使用 boost::multi_index_container.

而不是 ThingCollection class