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

C++ std::unique_ptr作为参数的正确复制语义,c++,c++11,smart-pointers,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(

是否对接口进行了修改,以使第二次调用正常工作

还是我应该保持现状

我怀疑第一个案例中的额外建筑是故意这样设计的,所以很明显所有权正在转移

#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;
}
#包括
结构条{};
typedef std::unique_ptr 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,字符**argv)
{
UPBar p(新酒吧);
foo4(move(p));//好的,但是需要一个额外的构造,而不是下面的行
foo4(新条);//失败:是否进行任何修改以使其正常工作?
返回0;
}

第二个问题:如果我更改传递给右值引用(&&&)的所有参数,那么这样做是否有任何缺点?事实上,我应该确保所有的
std::unique\u ptr
参数都是通过右值引用传递的吗?

您可以将
unique\u ptr
构造为临时:

foo4( UPBar( new Bar ));
您还可以编写一个
make_unique
函数模板,类似于
shared_ptr
中存在的
make_shared

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) );
模板
std::unique_ptr使_唯一(Args&&…Args){
返回std::unique_ptr(新的T(std::forward(args)…);
}
foo4(使_独一无二());
//其他构造函数也可以调用:
foo4(使_唯一(x,y,z));

效果很好-tyvm。非常好的第二个技巧。顺便说一句,我是否应该将所有fooX()函数更改为接受RHR/&&而不是按值传递?@kfmfe04:no.始终按值获取
unique_ptr
s。请参见以下问题:。在这个函数中,我通过
&&
获取参数,因为它们将被转发到构造函数。