什么样的代码需要注意rvalue引用?

fre*_*low 14 c++ rvalue-reference c++11

我看到很多人在理解右值参考时遇到了问题."普通"C++代码(例如,使用标准库,但不实现它)是否需要在新标准出现时了解rvalue引用,或者人/代码是否只是假装rvalue引用不存在?rvalue引用主要涉及库实现者还是所有程序员?

Ste*_*sop 6

在GMan(又名gmannickg)关于这个主题的博客文章中,我没有看到任何不同意见:

http://blackninjagames.com/?p=95

总结:任何了解复制和交换(以及一般三个规则)的人都应该了解移动语义(以及因此的左值引用),因为最佳实践习语会因此而改变.因此,我认为,任何关心C++的人都是如此.

我不认为您必须知道,因为当然复制和交换仍然有效,它仍然是异常安全的,依此类推.我想有人可能会争论"普通"C++代码和程序员是否需要知道复制和交换.我希望答案是"好吧,呃,显然",但你永远不会知道.

当然,人们可以开始使用C++ 0x的地方因地而异.很快就忘掉C++ 03可能不是一个好主意.

例如,如果您可以依赖移动分配,则在对副本省略无效的上下文中按值返回大型集合会变得更好.这不是C++ 03在C++ 0x中变得有效的事情,它的代码在C++ 03中非常,你可以解决这个问题(即使只有很好的位置swap) ,在C++ 0x中变得很好.因此,如果你假装rvalue引用不存在,你将继续解决你不需要的东西.如果你进行了跳跃,那么它可能会干净地向C++ 03后退,但是跑得很慢,这很痛苦.

所以聪明的事情可能是了解它,并且在许多情况下假装它不存在.


Jer*_*fin 5

至少在大多数情况下,只要您愿意,就可以忽略它们.(重新)编写标准库以使用它们允许相当大的优化和一些新功能,但主要目标之一是现有代码应该继续正常工作(尽管在某些情况下,更快).

支持现有代码意味着任何感觉它的人都可以继续以与以前相同的方式编写代码,并且不会受到任何影响(同样,除了他们使用的某些库"东西"可能更快).

同时,有一些很好的理由,有人可能想要学习至少一些经验法则,让他们可以简单地使用rvalue-references.一个明显的例子是人们现在经常遇到的一个问题:他们有一个类,复制对象没有意义,但是他们仍然希望能够将这些对象放在一个集合中(例如,一个向量) ).

他们可以通过使该类的对象可移动但不可复制来实现.一个主要的例子是流 - 现在,你不能将任何类型的iostream对象放入集合中,但在C++ 0x中你将能够.

另一种可能性是使用"完美转发".这可以使得将以前已经将许多单独的功能合并到一个具有非常简单的前端的功能中变得更加容易,这些前端全部转发到执行实际工作的功能.你总是可以不用这个,但在某些情况下,它可以使代码重复性降低.