右值引用如何实现移动语义中的完美转发?
- 内容介绍
- 文章标签
- 相关推荐
本文共计3197个文字,预计阅读时间需要13分钟。
文章预先发布于:apokpok.ink名称解释:移动语义:使用不那么繁琐的操作代替繁琐的复制操作,使得仅支持移动变体,例如unique_ptr,将数据的所有权移交给别人而不是多者同时引用。
名词解释文章预先发布于:pokpok.ink
-
移动语义:用不那么昂贵的操作代替昂贵的复制操作,也使得只支持移动变得可能,比如 unique_ptr,将数据的所有权移交给别人而不是多者同时引用。
-
完美转发:目标函数会收到转发函数完全相同类似的实参。
-
右值引用:是这两个机制的底层语言机制,形式是 Type&&,能够引用到“不再使用”的数据,直接用于对象的构造
要注意的是,形参一定是左值,即使类型是右值引用:
void f(Widget&& w) {
/* w 在作用域内就是一个左值。 */
}
实现移动语意和完美转发的重要工具就是std::move 和 std::forward,std::move 和 std::forward 其实都是强制类型转换函数,std::move 无条件将实参转换为右值,而 std::forward 根据实参的类型将参数类型转化为左值或者右值到目标函数。
本文共计3197个文字,预计阅读时间需要13分钟。
文章预先发布于:apokpok.ink名称解释:移动语义:使用不那么繁琐的操作代替繁琐的复制操作,使得仅支持移动变体,例如unique_ptr,将数据的所有权移交给别人而不是多者同时引用。
名词解释文章预先发布于:pokpok.ink
-
移动语义:用不那么昂贵的操作代替昂贵的复制操作,也使得只支持移动变得可能,比如 unique_ptr,将数据的所有权移交给别人而不是多者同时引用。
-
完美转发:目标函数会收到转发函数完全相同类似的实参。
-
右值引用:是这两个机制的底层语言机制,形式是 Type&&,能够引用到“不再使用”的数据,直接用于对象的构造
要注意的是,形参一定是左值,即使类型是右值引用:
void f(Widget&& w) {
/* w 在作用域内就是一个左值。 */
}
实现移动语意和完美转发的重要工具就是std::move 和 std::forward,std::move 和 std::forward 其实都是强制类型转换函数,std::move 无条件将实参转换为右值,而 std::forward 根据实参的类型将参数类型转化为左值或者右值到目标函数。

