mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-03 13:50:43 +08:00
Update item23.md
Co-authored-by: Yi Yang <qingfeng.yy@alibaba-inc.com>
This commit is contained in:
parent
bb892d270a
commit
8ab84fba00
@ -149,7 +149,7 @@ logAndProcess(std::move(w)); //用右值调用
|
||||
|
||||
你也许会想知道`std::forward`是怎么知道它的实参是否是被一个右值初始化的。举个例子,在上述代码中,`std::forward`是怎么分辨`param`是被一个左值还是右值初始化的? 简短的说,该信息藏在函数`logAndProcess`的模板参数`T`中。该参数被传递给了函数`std::forward`,它解开了含在其中的信息。该机制工作的细节可以查询[Item28](https://github.com/kelthuzadx/EffectiveModernCppChinese/blob/master/5.RRefMovSemPerfForw/item28.md)。
|
||||
|
||||
考虑到`std::move`和`std::forward`都可以归结于转换,他们唯一的区别就是`std::move`总是执行转换,而`std::forward`偶尔为之。你可能会问是否我们可以免于使用`std::move`而在任何地方只使用`std::forward`。 从纯技术的角度,答案是yes:`std::forward`是可以完全胜任,`std::move`并非必须。当然,其实两者中没有哪一个函数是**真的必须**的,因为我们可以到处直接写转换代码,但是我希望我们能同意:这将相当的,嗯,让人恶心。
|
||||
考虑到`std::move`和`std::forward`都可以归结于转换,它们唯一的区别就是`std::move`总是执行转换,而`std::forward`偶尔为之。你可能会问是否我们可以免于使用`std::move`而在任何地方只使用`std::forward`。 从纯技术的角度,答案是yes:`std::forward`是可以完全胜任,`std::move`并非必须。当然,其实两者中没有哪一个函数是**真的必须**的,因为我们可以到处直接写转换代码,但是我希望我们能同意:这将相当的,嗯,让人恶心。
|
||||
|
||||
`std::move`的吸引力在于它的便利性:减少了出错的可能性,增加了代码的清晰程度。考虑一个类,我们希望统计有多少次移动构造函数被调用了。我们只需要一个`static`的计数器,它会在移动构造的时候自增。假设在这个类中,唯一一个非静态的数据成员是`std::string`,一种经典的移动构造函数(即,使用`std::move`)可以被实现如下:
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user