这里我尝试在构造函数中使用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
答案 0 :(得分:3)
唯一指针最多代表其指针的一个所有者。因此,无法复制唯一指针。然而,它可以移动,它将(潜在)所有权转移到移动目标并使移动源保持为空(即不拥有任何东西)。
鉴于类Xp
,Xl
和Xx
,每个类都有成员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); }
但只有Xp
和Xx
才有合理的构造函数。它们可以按如下方式使用:
{
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!