2

コピーが必要ない場合、これは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 );
}
4

3 に答える 3

10

このように (値で) 渡されると、配列はポインター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] )
于 2011-11-30T22:05:14.400 に答える
0

あなたがしていることは、あなたが望むものには問題ありません (ただし、それが最適な設計かどうかはわかりません)。

配列は、関数に渡されるとポインターに減衰し、配列を受け取ると宣言された関数は、ポインターを受け取る関数に調整されるためdoWork、は で宣言されxた の配列へのポインターであり、配列のメンバーへの代入は で表示されます。unique_ptr<Foo> arrmainmain

于 2011-11-30T22:06:10.717 に答える
0

代わりにポインターを渡します。とにかく配列を関数に渡すことはできないので、コードはすでにそれを行っています.コンパイラは、配列として宣言された関数パラメータを静かに混乱させながらポインタに変換します.

于 2011-11-30T22:07:07.257 に答える