std::pair 和标准集合中的自定义 unique_ptr

Custom unique_ptr inside std::pair and standard collections

我正在尝试在 std::pair 集合中使用自定义 unique_ptr。下面是我到目前为止的内容,但是如果我取消注释第一个注释掉的行,那么我会得到一个错误:

No matching constructor for initialization of PairedThing1

所以我还没有将这些对放入容器中(第二个注释掉的行)。

我已经在评论中注明了我的意图。我正在寻找正确的 C++ 咒语。

template<class T> using UniqueThingRef = typename std::unique_ptr<std::remove_pointer_t<T>, void(*)(T)>;

typedef struct Thing1* Thing1Ref;
using PairedThing1 = std::pair<UniqueThingRef<Thing1Ref>, int>;

Thing1Ref MakeThing1()
{
    return (Thing1Ref)(new char()); //fake this for now
}

void KillThing1( Thing1Ref t)
{
    delete (char*)t; //fake this for now
}

static void trythings()
{
    UniqueThingRef<Thing1Ref> uni(MakeThing1(), KillThing1);
//  PairedThing1 duo(uni, 42); //uni should drop ref and hand to duo

    std::vector< PairedThing1> someThings;
//  someThings.insert( someThings.begin(), duo); //duo should drop ref and hand to someThings
}

您不能复制 std::unique_ptr(因此得名)。你必须移动它。

PairedThing1 duo(uni, 42);

应该是

PairedThing1 duo(std::move(uni), 42);

同样,第二段注释的代码应该是

someThings.insert(someThings.begin(), std::move(duo));