std :: unique_ptr的正确复制语义作为参数

时间:2011-12-03 07:00:48

标签: c++ c++11 smart-pointers

接口是否有修改可以让第二次调用工作?

或者我应该保留原样?

我怀疑第一种情况下的额外构造是故意设计的,所以很明显所有权正在转移。

#include <memory>

struct Bar { };
typedef std::unique_ptr<Bar> UPBar;

void foo1( UPBar p ) {  }
void foo2( UPBar p ) { foo1( move( p )); }
void foo3( UPBar p ) { foo2( move( p )); }
void foo4( UPBar p ) { foo3( move( p )); }

int main(int argc, char** argv)
{
    UPBar p( new Bar );
    foo4( move( p ));  // ok, but requires an extra construction vs line below
    foo4( new Bar );   // fails: any modification to get this to work?

    return 0;
}

第二个问题:如果我更改了传递给RValue-References(&amp;&amp;)的所有参数,这样做有什么不利之处吗?实际上,我应该确保RValue-References传递了所有std::unique_ptr<>个参数吗?

1 个答案:

答案 0 :(得分:2)

您可以将unique_ptr构建为临时的:

foo4( UPBar( new Bar ));

您还可以编写make_unique功能模板,类似于make_shared存在的shared_ptr

template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<T>(args)...));
}

foo4( make_unique<Bar>() );
// other constructors are also callable:
foo4( make_unique<Bar>(x, y, z) );