如果我不想要副本,这是传递一组 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] )
您正在做的事情对您想要的很好(尽管我不确定这是最好的设计)。
因为数组在传递给函数时会衰减为指针,并且声明为采用数组的函数会调整为采用指针的函数,所以 insidedoWork
是x
指向unique_ptr<Foo>
arr
声明的数组的指针,main
并且对数组成员的赋值将在 中可见main
。
您改为传递一个指针。由于无论如何您都不能将数组传递给函数,因此您的代码已经这样做了——编译器会默默地将声明为数组的任何函数参数转换为指针。