如何在构造函数中使用unique_ptr?

时间:2015-12-12 16:11:52

标签: c++

这里我尝试在构造函数中使用unique_ptr。它给出了以下错误:

function" std :: unique_ptr< _Ty,_Dx> :: operator =(const std :: unique_ptr< _Ty,_Dx> :: _ Myt&)[with _Ty = ABC,_Dx = std :: default_delete ]" (在#34; C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ VC \ include \ memory")的第1487行声明 - 无法引用 - 它是已删除的函数

我怎样才能实现它?

StructCol.h

#include "stdafx.h"
#ifndef StructCol_H
#define StructCol_H

#include<string>
#include<memory>
using namespace std;

class ABCD
{
    public:
    std::unique_ptr<ABC> & n;

    ABCD(std::unique_ptr<ABC> & n1) : n(n1)
    {
        n = n1;
    }

    void print()
    {
        cout << n->no << endl;
        cout << n->text_c << endl;
        cout << n->no_c << endl;
    }
};

class ABC
{
public:
    string test;
    int no;
    string text_c;
    int no_c;

    ABC()
    {

    }

    ABC(string text_c1, int no_c1)
    {
        text_c = text_c1;
        no_c = no_c1;
    }

    void print()
    {
        cout << test << endl;
        cout << no << endl;
        cout << text_c << endl;
        cout << no_c << endl;
    }
};

#endif

1 个答案:

答案 0 :(得分:3)

唯一指针最多代表其指针的一个所有者。因此,无法复制唯一指针。然而,它可以移动,它将(潜在)所有权转移到移动目标并使移动源保持为空(即不拥有任何东西)。

鉴于类XpXlXx,每个类都有成员std::unique_ptr<T> p_;,以下构造函数都可以工作:

Xp(std::unique_ptr<T> p) : p_(std::move(p)) {}
Xp(std::unique_ptr<T> p) { p_ = std::move(p); }

Xl(std::unique_ptr<T> & p) : p_(std::move(p)) {}
Xl(std::unique_ptr<T> & p) { p_ = std::move(p); }

Xx(std::unique_ptr<T> && p) : p_(std::move(p)) {}
Xx(std::unique_ptr<T> && p) { p_ = std::move(p); }

但只有XpXx才有合理的构造函数。它们可以按如下方式使用:

{
    Xp xp(std::make_unique<T>(a, b ,c));
    Xx xx(std::make_unique<T>(a, b ,c));
}
{
    auto p = std::make_unique<T>(a, b ,c);
    // Xp xp(p);  // Error, cannot duplicate p!
    Xp xp(std::move(p));
}
{
    auto p = std::make_unique<T>(a, b ,c);
    // Xx xx(p);  // Error, cannot duplicate p!
    Xx xx(std::move(p));
}

另一方面,Xl的构造函数很奇怪且令人惊讶:

// Xl xl(std::make_unique<T>(a, b ,c));  // Error, cannot bind to temporary
auto p = std::make_unique<T>(a, b ,c);
Xl xp(p);              // OK?!?
assert(p == nullptr);  // grand theft autoptr!