【发布时间】:2013-07-18 14:25:55
【问题描述】:
我无法让 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的实现。
提前致谢。
【问题讨论】:
标签: compiler-errors unique-ptr llvm-clang