如果我不想复制,这是传递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 );
}
答案 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)
您传递指针。由于你无法将数组传递给函数,你的代码已经这样做了 - 编译器会默默地将任何声明为数组的函数参数转换为指针。