传递unique_ptrs数组的正确方法是什么?

时间:2011-11-30 22:00:22

标签: c++ c++11 unique-ptr

如果我不想复制,这是传递unique_ptrs数组的正确方法吗?

换句话说,我希望x中发生的一切都会影响调用者的身份。

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 );
}

3 个答案:

答案 0 :(得分: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] )

答案 1 :(得分:0)

你正在做什么对你想要的东西很好(虽然我不确定它是最好的设计)。

因为数组在传递给函数时衰减为指针,并且声明为采用数组的函数被调整为带有指针的函数,所以在doWork内,x是指向unique_ptr<Foo> {数组的指针在arr中声明{1}},main中将显示对数组成员的赋值。

答案 2 :(得分:0)

您传递指针。由于你无法将数组传递给函数,你的代码已经这样做了 - 编译器会默默地将任何声明为数组的函数参数转换为指针。