ヘルパー関数に aを渡したいのですがunique_ptr、ヘルパー関数がポインターもポイントされたオブジェクトも変更しないようにしたいのです。がなければunique_ptr、解決策は
void takePtr(AClass const * const aPtr) {
// Do something with *aPtr.
// We cannot change aPtr, not *aPtr.
}
(まあ、技術的にAClass const * aPtrは十分です。)そして、これを次のように呼び出すことができます
AClass * aPtr2 = new AClass(3);
takePtr(aPtr2);
代わりに を使用したいのですunique_ptrが、これの書き方がわかりません。私は試した
void takeUniquePtr(unique_ptr<AClass const> const & aPtr) {
// Access *aPtr, but should not be able to change aPtr, or *aPtr.
}
これを呼び出すと
unique_ptr<AClass> aPtr(new AClass(3));
takeUniquePtr(aPtr);
コンパイルされません。私が見るエラーは
testcpp/hello_world.cpp:141:21: error: invalid user-defined conversion from ‘std::unique_ptr<AClass>’ to ‘const std::unique_ptr<const AClass>&’ [-fpermissive]
からの変換を自動unique_ptr<AClass>にするべきではありませんか? unique_ptr<AClass const>ここで何が欠けていますか?
ちなみに、関数定義を に変更unique_ptr<AClass const> const & aPtrするとコンパイルは通りますが、許可したくないunique_ptr<AClass> const & aPtrのような関数を呼び出すことができます。aPtr->changeAClass()