【问题标题】:push_back(move(struct.unique_ptr)) causes compile errors [closed]push_back(move(struct.unique_ptr)) 导致编译错误[关闭]
【发布时间】:2015-07-10 12:03:30
【问题描述】:

我有一个类似的功能

for (auto&& i : v) {
    ...
    this->fifoQueue.push_back(move(i.p));
    ...
}

其中fifoQueue 的类型为vector<unique_ptr<T> >v 的类型为vector<struct s>struct s 的类型为

struct s {
    ...
    std::unique_ptr<T> p;
    ...
};

语句this-&gt;fifoQueue.push_back(move(i.p)); 导致编译器错误“... error: declared here unique_ptr(const unique_ptr&amp;) = delete; ...”。这句话有什么问题?

我还有另一个基本相同的工作声明,除了那个声明类似于this-&gt;fifoQueue.push_back(move(p))。那么i.p是邪恶的吗?还是auto&amp;&amp;


更新:

正如 Petr 推断的那样,v 确实是一个 const 引用,这导致了错误。

【问题讨论】:

  • MCVE 请....
  • 您确定您的第一个代码中的v 不是const?而且没有其他地方可以让i.p变成const
  • 只是好奇,this-&gt;fifoQueue.push_back(move(i).p) 呢?
  • 圣洁...是的,vconst。我的错。一直熬夜,现在有点头晕。谢谢。
  • This 没有给出任何错误。

标签: c++ struct unique-ptr


【解决方案1】:

(扩展我的评论)

您的错误消息unique_ptr(const unique_ptr&amp;) 似乎表明i.p 变为const,因此push_back 必须复制它(或者实际上甚至std::move 也必须复制它,请参阅this answer )。但是,unique_ptr 不能构造为const unique_ptr&amp; 的副本,因为考虑到unique_ptr 的性质,这绝对是毫无意义的。所以你应该看看它是从哪里变成const的。

我认为这个constness 的最可能来源来自v,因为你没有向我们展示那个声明。

【讨论】:

    【解决方案2】:

    如上所述,编译器似乎想要复制您的结构。因为这个unique_ptr 在里面它不能。

    当你想到它时,猜猜这里的 auto 是什么意思?它应该是yourStruct &amp; 而不是yourStruct,因为你实际上可以修改这个vector 中的结构。因为reference collapsing 你从auto &amp;&amp; 得到yourStruct &amp;

    总而言之,不要考虑如何使用push_back 避免这种情况,只需使用emplace_back,它会强制在向量内进行构造。

    【讨论】:

      猜你喜欢
      • 2019-04-04
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 2012-12-27
      • 2015-06-29
      • 1970-01-01
      相关资源
      最近更新 更多