C++のstd::unique_ptrを使った時に
moveメソッドがうまくコンパイルできなかったので
色々とメモしておきます。
ポインタを扱うときに自分でnewやdeleteはしないほうがいいよと
最近、いろいろなところで目にします。
その辺りの処理はオブジェクトに任せるべきらしい。
ではどうするかと考えた時に、unique_ptrがどうやらよさげ
所有権の移譲も簡単にできるし!と思ったら躓きました
namespace TestClass
{
class TestClass
{
public:
TestClass();
explicit TestClass(const TestClass&); // コピーコンストラクタ有効
TestClass& operator=(const TestClass&); // コピー演算子有効
private:
std::unique_ptr<T> unique_;
}
}
TestClass::TestClass::TestClass(const TestClass& tc)
{
unique_ = std::move(tc.unique_); // これがやりたい
}
上のようにstd::moveしようとするとADL(引数依存ルックアップ)でどうやら
std::unique_ptrが属する名前空間のoperator=が呼び出されてるっぽいようなエラー。。。
(ちなみにunique_ptrのoperator=はprivateです)
あれこれ考えてた結果!
引数のconstなくしたらstd::move使えました()笑
TestClass::TestClass::TestClass(TestClass& tc)
{
unique_ = std::move(tc.unique_); // でけた!
}
考えてみたら所有権を移譲しようとしてるので当たり前ですね。
このクラスは値クラスにしようと思ってたのですが、完全な設計ミス・・・