How*_*ant 24 c++ move-semantics c++11
在C++ 11中,引入了"移动语义",通过两个特殊成员实现:移动构造函数和移动赋值.这两个操作都保留了构造的移动对象.
将源保持在破坏状态不是更好吗?对于移动对象,你唯一能做的就是破坏它吗?
How*_*ant 27
在"移动操作的世界"中有四种可能性:
target source
is is left
----------------------------------------------------------
constructed <-- constructed // C++11 -- move construction
constructed <-- destructed
assigned <-- constructed // C++11 -- move assignment
assigned <-- destructed
Run Code Online (Sandbox Code Playgroud)
每个操作都很有用! std::vector<T>::insert单独就可以利用前三个.虽然注意:
X x1, x2;
if (sometimes)
{
x1 = std::move(x2);
}
// Is x2 moved-from here?
Run Code Online (Sandbox Code Playgroud)
第2和第4可以分别由第1和第3模拟,只需在操作后手动调用源上的析构函数即可.
第一和第三是至关重要的.诸如std::swap并且std::sort经常需要这些操作的算法.这些算法不需要破坏任何输入对象 - 只需更改其值.
有了这些知识,在2001 - 2002年的时间框架内,我把我的工作集中在两个操作上,这两个操作都是由于这两个操作对C++ 98的影响最大(正面).我当时知道,如果我没有减少这个项目的野心,它将永远不会成功.即使是缩减规模,也只是过于雄心勃勃才能取得成功.
缩减在原始移动语义提议的"破坏性移动语义"一节中得到了承认.
最后,我们只是因为太多的痛苦而没有获得足够的收益而放弃了这一点.但是,目前的提案并未禁止未来的破坏性移动语义.如果有人希望携带该火炬,除了本提案中概述的非破坏性移动语义之外,还可以进行此操作.
有关移动对象的更多详细信息,请参阅/sf/answers/491982291/