C ++ UNIQUE_PTR定数参照
-
23-12-2019 - |
質問
リソース処理を簡素化するために、Unique_PTRを使用してポインタを使用してソリューションを移行しようとしています。私は、移動セマンティクスとUnique_PTRで動作するためのstd::move()
の使用を認識しています。
現在、私は署名int foo(const T2DMatrix* m)
を持つ関数を持っていて、私は動的に割り当てられた2D-Matrixオブジェクトを使用してこれを呼び出します。関数foo
には、T2DMatrixクラス、したがってconst引数への読み取り専用アクセスのみが必要です。さて、私はこれをint foo(unique_ptr<const T2DMatrix>& m)
に移行しました。異なる機能から、process()
オブジェクト(ファクトリ関数を使用して作成された)を持つunique_ptr<T2DMatrix>
から、オブジェクトをfooに渡します。ただし、コンパイラは私がそうすることを許可しません。注意してください。オブジェクトの所有権をprocess()
からfoo()
、したがって参照の使用を転送したくありません。 unique_ptr<const T2DMatrix>
を使用してFOO()を呼び出すと、関数の署名を変更するとConst保証は適用されません。
注:PROCESS()に新しいunique_ptr<const T2DMatrix>
オブジェクトを作成し、unique_ptr<T2DMatrix>
を使用してOriginal std::move()
オブジェクトから所有権を転送することで、Foo()に渡し、再度PROCESS()で所有権を転送します。 。しかしこれは理想的な解決策のように思えます。
POINTERソリューションと同等のものをお勧めします。これにより、T2DMATRIX *引数をconst t2dmatrix *パラメーターに渡すことができます。 MSVC2012、MSVC2013、およびG ++ 4.8を使用して同じ結果を得てみました。
解決
関数が所有権を必要としない場合は、unique_ptr
:
int foo(T2DMatrix const& m);
std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);
.
関数が所有権を気にしない場合は、foo
を人工的に制約する必要はありません。