これらのクラスをコンパイルするための 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
クラス インターフェイスでの実装を非表示にします。
前もって感謝します。