【问题标题】:std::move or std::forward with parameter std::unique_ptr<T>&&std::move 或 std::forward 带参数 std::unique_ptr<T>&&
【发布时间】:2016-03-21 05:17:57
【问题描述】:

我有以下模板类(精简为仅包含相关部分),其中包含一个用 C++ 11 编写的名为 Push 的方法:

template<class T, int Capacity>
class CircularStack
{
private:
    std::array<std::unique_ptr<T>, Capacity> _stack;

public:
   void Push(std::unique_ptr<T>&& value)
   {
      //some code omitted that updates an _index member variable

      _stack[_index] = std::move(value);
   }
}

我的问题是:

我应该在Push 中使用std::move 还是std::forward

我不确定std::unique_ptr&lt;T&gt;&amp;&amp; 是否有资格作为通用参考,因此应该使用forward 而不是move

我对 C++ 相当陌生。

【问题讨论】:

  • 如果您来自管理语言,请尽量不要模仿“引用-”方法。在 C++ 中,对象数组在大多数情况下应该是对象数组,而不是使用new 动态填充的引用数组。请记住这一点。
  • 感谢您的提示,如果Push 将获得继承T 的类型实例,std::unique_ptr&lt;T&gt; 是否可以?
  • @keith 是的,std::unique_ptr 对于拥有多态类型的容器是合理的,就像你描述的情况一样。

标签: c++ c++11


【解决方案1】:

你应该使用std::move

std::unique_ptr&lt;T&gt;&amp;&amp; 是右值引用,而不是转发引用*。函数参数中的转发引用必须类似于T&amp;&amp;,其中推导出T,即声明函数的模板参数。

* 转发参考是您所谓的通用参考的首选名称。

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2019-11-07
    • 2018-02-02
    • 2014-04-15
    • 2015-07-23
    • 2015-10-11
    相关资源
    最近更新 更多