gpt4 book ai didi

compiler-errors - unique_ptr 作为类成员和移动语义无法使用 clang 编译

转载 作者:行者123 更新时间:2023-12-02 10:45:33 26 4
gpt4 key购买 nike

我无法让 clang(Apple LLVM 版本 4.2 (clang-425.0.28))编译这些类:

struct A {
int f(){return 2;}
};
class Cl{
std::unique_ptr<A> ptr;

public:
Cl(){ptr = std::unique_ptr<A>(new A);}

Cl(const Cl& x) : ptr(new A(*x.ptr)) { }
Cl(Cl&& x) : ptr(std::move(x.ptr)) { }
Cl(std::unique_ptr<A> p) : ptr(std::move(p)) { }

void m_ptr(std::unique_ptr<A> p){
ptr = std::unique_ptr<A>(std::move(p));
}
double run(){return ptr->f();}
};

我想按如下方式运行构造函数:
std::unique_ptr<A> ptrB (new A);
Cl C = Cl(ptrB);

但如果我这样做,我会收到以下编译器错误:
../src/C++11-2.cpp:66:10:错误:调用“std::unique_ptr”的隐式删除的复制构造函数
C.m_ptr(ptrB);

我可以通过运行 Cl(std::move(ptrB)) 来解决编译器问题但这实际上并没有将 A 的所有权从 ptrB 转移:我仍然可以运行 ptrB->f()不会导致运行时崩溃...其次,构造函数不是很令人满意,因为我想隐藏 std::move 的实现在类界面中。

提前致谢。

最佳答案

由于 ptrB 已通过 按值(value) 对于 Cl 的复制构造函数,对 Cl(ptrB) 的调用试图创建 ptrB 的副本,而后者又调用 unique_ptr 的(显然禁用的)复制构造函数。为了避免创建 ptrB 的额外副本,请执行以下操作:

Cl C = Cl(std::unique_ptr<A>(new A)); //A temporary is created on initialization, no extra copy steps performed

或者:
std::unique_ptr<A> ptrB (new A);
Cl C = Cl(std::move(ptrB)); //Move semantics used. Again, no extra copy steps

或者,在复制构造函数中使用引用传递(右值或左值):
class Cl{

//...
public:
//...
Cl(std::unique_ptr<A> &p) : ptr(std::move(p)) { }

//...

};

std::unique_ptr<A> ptrB (new A);
Cl C = Cl(ptrB);

P.S 哦,顺便说一句:对象保持未指定,但是 有效 std::move() 之后的状态。我相信这意味着您仍然可以调用 ptrB->f(),并且可以保证
返回 2 :)

关于compiler-errors - unique_ptr 作为类成员和移动语义无法使用 clang 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17726257/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com