Effective Modern C++ 中的第 29 项,Scott Meyers 列出了移动语义不会提高代码性能的三个场景,
[…] 移动语义对你没有好处:
- 无移动操作:要移动的对象无法提供移动操作 […]
- 移动不快: […] 移动操作不比其复制操作快。
- 移动不可用:上下文 […] 需要一个不发出异常的移动操作,但该操作未声明
noexcept
。
前面几页都解释清楚了,然后再加一个
[…] 移动语义没有提供效率增益的另一种情况:
- 源对象是左值:除了极少数例外(参见条款 25),只有右值可以用作移动操作的源。
(第 25 项的标题为Use std::move
on rvalue references 和std::forward
on Universal references,但我看不出它与交叉引用它的项目符号点有何关系。)
在此之后,文本基本上回到了对该项目的总结,没有进一步提及第四个要点。
那个要点是指什么?
据我了解移动语义,即使我想从左值移动,比如说x
,我仍然需要通过std::move(x)
(或等效的static_cast
)将它转换为右值,所以我在技术上仍然从右值移动(特别是 xvalue在这种情况下),而不是左值。
所以我很想说左值不能是移动操作的源对象。
我对这个话题缺少什么?