首页 > 后端开发 > C++ > 正文

std::move() 如何处理 C 中的左值?

Mary-Kate Olsen
发布: 2024-11-14 14:46:02
原创
346 人浏览过

How Does std::move() Handle Lvalues in C  ?

std::move() 对左值有什么作用?

std::move() 是 C 语言中一个强大的工具,可以促进完美转发。然而,乍一看,它的实施可能会引起一些人的注意。为了阐明 std::move() 如何实现这一点,让我们深入研究其实现的复杂性。

理解“移动”函数

我们将从'move' 函数模板的简化版本:

template <typename T>
typename remove_reference<T>::type&& move(T&& arg)
{ return static_cast<typename remove_reference<T>::type&&>(arg); }
登录后复制

Case 1:传递右值

当使用右值(临时对象或计算结果为右值的表达式)调用 std::move() 时,移动模板将实例化如下:

// move with [T = Object]:
remove_reference<Object>::type&& move(Object&& arg)
{ return static_cast<remove_reference<Object>::type&&>(arg); }
登录后复制

由于remove_reference;将对象转换为对象,我们最终得到:

Object&& move(Object&& arg) { return static_cast<Object&&>(arg); }
登录后复制

正如预期的那样,该函数只是将其右值参数转换为右值引用。

情况 2:传递左值

现在,当使用左值(一个命名的

Object a; // a is lvalue
Object b = std::move(a);
登录后复制

这一次,移动模板实例化为:

// move with [T = Object&]
remove_reference<Object&>::type&& move(Object& && arg)
{ return static_cast<remove_reference<Object&>::type&&>(arg); }
登录后复制

再次,remove_reference
Object&& move(Object& && arg) { return static_cast<Object&&>(arg); }
登录后复制

乍一看,这似乎违反直觉,因为我们传递了一个左值。然而,C 11引入了引用折叠的概念,它修改了引用语法的解释:

  • Object & & = Object &
  • Object & & && = 对象 &
  • 对象 & && & = 对象 &
  • 对象 & && & && = Object & &&

在这些规则下,Object& && 实际上表现为 Object&,一个可以绑定到左值的普通左值引用。

因此,函数的最终形式变为:

Object&& move(Object& arg) { return static_cast<Object&&>(arg); }
登录后复制

本质上,std::move() 将左值参数转换为右值引用,从而使无论输入类型如何,完美转发。

以上是std::move() 如何处理 C 中的左值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板