ヘルパー関数に 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()