unique_ptr <t>和unique_ptr <t>&amp;&amp; </t> </t>之间的区别

时间:2014-08-19 08:27:18

标签: c++ c++11 move-semantics unique-ptr rvalue-reference

以下两个声明之间有什么区别?我应该何时优先选择另一个?

void f(unique_ptr<T> x);
void f(unique_ptr<T> &&x);

在我看来,这两者都意味着f()取得了对象的所有权,但我看到人们都使用它们。我希望第一个是标准的,第二个被认为是一个不好的做法。

1 个答案:

答案 0 :(得分:6)

第二个版本,即参考版本,效率更高一些,因为没有为函数参数构造单独的对象。您会在通用库代码中找到这种样式,您不希望在用户身上施加任何不必要的成本。

第一个版本更易于阅读和记忆,并且允许稍微更一般的建议,以便按照您想要拥有的价值传递事物&#34;。这个建议在你的案例中并不完全适用,但在其他情况下也是如此。考虑一个拥有字符串的类:

struct Foo
{
    std::string s_;
    Foo(std::string s) : s_(std::move(s)) {}
};

通过按值传递构造函数参数,您现在可以从左值和右值字符串构造Foo,然后决定是复制还是移动到std::string的构造函数而不是自己担心。这降低了复杂性(假设您有五个这样的参数)。


作为一般建议的最后一句,请记住,C ++标准库认为绑定到右值引用的任何值都是非混淆的,即通过该引用仅引用 而没有其他人。这是一个重要的&#34;隐藏&#34;语义假设。因此,即使rvalue引用是一个参考,你原则上可以使用它来引用一些共享状态,但不要过度使用它,因为它会出乎意料并且令人惊讶。