我是新手在C++ 11中移动语义,我不太清楚如何处理unique_ptr构造函数或函数中的参数.考虑这个引用自身的类:
#include <memory>
class Base
{
public:
typedef unique_ptr<Base> UPtr;
Base(){}
Base(Base::UPtr n):next(std::move(n)){}
virtual ~Base(){}
void setNext(Base::UPtr n)
{
next = std::move(n);
}
protected :
Base::UPtr next;
};
Run Code Online (Sandbox Code Playgroud)
这是我应该如何编写unique_ptr参数的函数?
我需要std::move在调用代码中使用吗?
Base::UPtr b1;
Base::UPtr b2(new Base());
b1->setNext(b2); //should I write b1->setNext(std::move(b2)); instead?
Run Code Online (Sandbox Code Playgroud) 使用std::vector::emplace_back和std::move一起有什么好处?或者它只是多余的,因为std::vector::emplace_back会做一个inplace-construction?
案例澄清:
std::vector<std::string> bar;
Run Code Online (Sandbox Code Playgroud)
第一:
bar.emplace_back(std::move(std::string("some_string")));
Run Code Online (Sandbox Code Playgroud)
第二:
std::string str("some_string");
bar.emplace_back(std::move(str));
Run Code Online (Sandbox Code Playgroud)
第三:
bar.emplace_back(std::move("some_string"));
Run Code Online (Sandbox Code Playgroud) 基于在回答这些 问题 在这里,我知道这肯定是最好使用C++ 14的std::make_unique,而不是emplace_back(new X)直接.
那就是说,打电话是首选
my_vector.push_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)
要么
my_vector.emplace_back(std::make_unique<Foo>("constructor", "args"));
Run Code Online (Sandbox Code Playgroud)
也就是说,我应该使用push_back或emplace_back何时添加std::unique_ptr构造的std::make_unique?
====编辑====
为什么?c:< - (微笑)