コピーが必要ない場合、これはunique_ptrsの配列を渡す正しい方法ですか?
言い換えれば、xに発生するすべてのことが発信者のarrに影響を与えるようにしたいのです。
void doWork( unique_ptr<Foo> x[] )
{
// I want assignments to x to impact caller's arr
}
int main()
{
unique_ptr<Foo> arr[10];
doWork( arr );
}
コピーが必要ない場合、これはunique_ptrsの配列を渡す正しい方法ですか?
言い換えれば、xに発生するすべてのことが発信者のarrに影響を与えるようにしたいのです。
void doWork( unique_ptr<Foo> x[] )
{
// I want assignments to x to impact caller's arr
}
int main()
{
unique_ptr<Foo> arr[10];
doWork( arr );
}
このように (値で) 渡されると、配列はポインター1に減衰するため、コードに実際の問題はありません。ただし、以下は確かに C++ に近いものです。
typedef std::vector<std::unique_ptr<Foo> > FooVec; // dynamic size
typedef std::array<std::unique_ptr<Foo>, 10> FooArr; // fixed size (10)
void doWork( FooVec& x ) // or FooArr&
{
// I want assignments to x to impact caller's arr
}
int main()
{
FooVec vec(10);
FooArr arr;
doWork( vec );
}
1つまり、
void doWork( unique_ptr<Foo> *x )
減衰を停止するには、参照渡し:
void doWork( unique_ptr<Foo> (&x)[10] )
あなたがしていることは、あなたが望むものには問題ありません (ただし、それが最適な設計かどうかはわかりません)。
配列は、関数に渡されるとポインターに減衰し、配列を受け取ると宣言された関数は、ポインターを受け取る関数に調整されるためdoWork
、は で宣言されx
た の配列へのポインターであり、配列のメンバーへの代入は で表示されます。unique_ptr<Foo>
arr
main
main
代わりにポインターを渡します。とにかく配列を関数に渡すことはできないので、コードはすでにそれを行っています.コンパイラは、配列として宣言された関数パラメータを静かに混乱させながらポインタに変換します.