【问题标题】:C++11 rvalue reference in pipe operator管道运算符中的 C++11 右值引用
【发布时间】:2016-10-11 19:43:15
【问题描述】:

我尝试使用虚拟管道类的一些通用实现来进行右值引用。

template<class I, class O>
class Pipeline
{
    vector<I> _inputs;
    virtual O Execute(void)
    { return foobar( _inputs ) }
};

我想实现运算符 | (管道)将多个管道组合在一起:
编辑:使用指针更改代码,使其与我的下一个代码示例匹配

// Pipeline* p1, p2, and p3 already exist
Pipeline* p0 = p1 | p2 | p3;
// is equivalent to
p2->_inputs.push_back(p3->execute());
p1->_inputs.push_back(p2->execute());
p0->_inputs.push_back(p1->execute());

我认为右值引用非常适合:

template<class I,class O>
Pipeline<I,O>&& operator | (Pipeline<K,O>* a, Pipeline<I,K>* b)
{
    Pipeline* p0 = a;
    Pipeline* p1 = b;

    p0->_inputs.pushback(p1->execute); //inputs is vector<I*> instead of vector<I>
    return std::move(p0);
}

请注意,我更喜欢通过地址而不是值传递,因为类型名 I 和 O 可能是大对象,而 Pipeline 在其内部工作中可能具有如此大的私有属性。

但是上面的代码显然有很多内存管理问题: 1/ std::move(p0) 意味着 p1 永远不会被释放/删除 2/ 如果我直接在 a 和 b 而不是 p0 p1 上工作,我会失去原来的指针?

有人可以帮助我并告诉我如何为管道运算符使用右值引用吗?

编辑:根据@Alexey Guseynov,我的示例不适用于右值参考。而不是功能代码(最小完整可验证示例)我正在寻找关于为什么 && 在这里无效以及我们应该何时使用它们的解释:它们背后的哲学是什么以及它们究竟带来了什么. 提前谢谢你

【问题讨论】:

  • Pipeline p0,p1,p2,p3; 不是有效代码。如果没有minimal reproducible example,我不知道谁能帮助你。
  • 我很确定p0 = p1 | p2 | p3; 会做p1 -&gt; p2 -&gt; p3 然后将p3 的输出存储在p0 中。
  • 澄清一下——这不是 C++ 中的管道运算符,而是 OR 运算符……您可能更喜欢使用流运算符
  • @Sahu 我没有一个最小的工作示例,这正是我正在努力做的事情。对不起
  • @NathanOliver 操作顺序是一个好点。不过,我现在不太关心它,当我有一个合适的工作示例时,我可以修复它。

标签: c++ operator-overloading rvalue-reference


【解决方案1】:

声明中的参数类型必须与您使用的参数类型匹配。所以如果你自己使用对象:

call.Pipeline p0,p1,p2,p3;
p0 = p1 | p2 | p3;

然后运算符 |必须带对象。在您的情况下,它必须采用const Pipeline&amp;。请注意,语义上 operator | 不会修改它的操作数,因此尽管允许,但您不应使用 Pipeline&amp;

右值引用不是一个好的返回类型:它们只是不适合在这里使用。您将返回对不再存在的临时对象的引用。你应该在这里返回一个值。

所以在你展示的代码中没有指针的地方,所以内存管理没有问题。

【讨论】:

  • 那我好像不懂右值。我读了很多关于他们的东西,但我似乎没有抓住重点。你能告诉我为什么他们首先被发明吗?他们带来了什么。什么时候使用它们是个好主意(std::move 在我的情况下似乎合适,但你说不合适)。我用谷歌搜索的教程都使用通用示例,但没有解释 && 的一般背景和原因
  • 有人请吗?我想了解什么时候是绝对需要右值引用而不是常规值的主要情况。
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
相关资源
最近更新 更多