带有移动仪器的源和汇的签名
Signature of source- and sink-functions with move-semantics
编写源和接收器功能时,我应该使用哪些签名来受益于移动语义,为什么?
T source();
sink(T);
// or
T&& source();
sink(T&&);
好吧,考虑到源创建并返回新对象,T&& source()
绝对是垃圾。不要从函数返回对本地变量的引用,此规则适用于RVALUE参考,因为它始终适用于LVALUE参考。
使用sink(T&&)
是一种口味问题。它并不是看起来干净和精简的,但另一方面,它更明确地强调了该功能的水槽,并且可以使移动强制性地强制性,即使对于也可以复制的类型也是如此。但是,如果T
应该是不可仿制的类型(例如std::unique_ptr
),我更喜欢sink(T)
,因为它看起来更加干净,并且无论如何,该类型的不可仿制性质都明确说明了移动。
,但是在所有情况下,您都会从移动语义中受益,这是他们的优势之一,它们将其融合在一起。因此,无论签名sink
具有哪种签名,T t = source();
都会像sink(std::move(t));
一样移动。仅仅是sink(T)
并不能阻止您使用sink(t);
调用它,而不是sink(std::move(t));
用于可复制类型,这反过来又不会使用移动语义。但这是一个完全不同的问题,因为无论如何,无论何时适当地使用std::move
应该是尽快学习的成语。
编辑:是真的,sink(T)
在不有效的可移动类型(使用基于值的实现,即std::array
)中发挥不佳,因为它需要一个副本(rvalue))参考可能会这样做。即使对于不移动的可移动类型,也比移动更快(尽管这应该可以忽略)。但是话又说回来,我认为,首先,来源和水槽在价值实现的类型方面并不能很好地发挥作用。在这种情况下,T source()
无论如何都不是一个好主意(但是,它也不能被上述T&& source()
取代)。
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 移动二维数组中的字符
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 安全到标准:移动会员?
- 带有移动仪器的源和汇的签名