c++ 11管道操作符中的右值引用
C++11 rvalue reference in pipe operator
我尝试用一些虚拟管道类的通用实现来进行右值引用。
template<class I, class O>
class Pipeline
{
vector<I> _inputs;
virtual O Execute(void)
{ return foobar( _inputs ) }
};
我想实现将多个管道组合在一起的操作符| (pipe):
编辑:修改代码与指针,使其匹配我的下一个代码示例
// 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);
}
请注意,我更喜欢通过地址而不是值传递,因为typename I和O可能是大对象,并且Pipeline在其内部工作中可能具有如此大的私有属性。
然而,上面的代码显然有很多内存管理问题:1/std::move(p0)表示p1永远不会被释放/删除如果我直接处理a和b而不是p1p1,我丢失了原来的指针?有人可以帮助我,告诉我如何使用右值ref管道操作符请?
编辑:根据@Alexey Guseynov,我的例子不适合右值参考,而不是功能代码(最小完全可验证的例子),我正在寻找一个解释为什么&&在这里是无效的,我们什么时候应该使用它们:它们背后的哲学是什么,它们到底能带来什么。提前谢谢大家
声明中的参数类型必须与您使用的参数类型匹配。如果你使用对象本身:
call.Pipeline p0,p1,p2,p3;
p0 = p1 | p2 | p3;
则操作符|必须接受对象。在你的例子中,它必须取const Pipeline&
。注意,语义上operator |
不会修改它的操作数,所以尽管允许,你也不应该使用Pipeline&
。
右值引用不是一个很好的返回类型:它们不是为在这里使用而设计的。您将返回对一个不再存在的临时对象的引用。你应该在这里返回一个值。
所以在你所展示的代码中没有指针的位置,所以内存管理没有问题。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- IPC使用多个管道和分支进程来运行Python程序
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- c++ 11管道操作符中的右值引用