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

您正在做的事情对您想要的很好(尽管我不确定这是最好的设计)。

因为数组在传递给函数时会衰减为指针,并且声明为采用数组的函数会调整为采用指针的函数,所以 insidedoWorkx指向unique_ptr<Foo> arr声明的数组的指针,main并且对数组成员的赋值将在 中可见main

于 2011-11-30T22:06:10.717 回答
0

您改为传递一个指针。由于无论如何您都不能将数组传递给函数,因此您的代码已经这样做了——编译器会默默地将声明为数组的任何函数参数转换为指针。

于 2011-11-30T22:07:07.257 回答