std::move() 对左值有什么作用?
std::move() 是 C 语言中一个强大的工具,用于促进完美转发。然而,乍一看,它的实施可能会引起一些人的注意。为了阐明 std::move() 如何实现这一点,让我们深入研究其实现的复杂性。
理解“移动”函数
我们将从“move”函数模板的简化版本:
templatetypename remove_reference ::type&& move(T&& arg) { return static_cast ::type&&>(arg); }
情况 1:传递右值
当使用右值(临时对象或计算结果为右值的表达式)调用 std::move() 时,移动模板实例化如下:
// move with [T = Object]: remove_reference
由于remove_reference
Object&& move(Object&& arg) { return static_cast
正如预期的那样,该函数只是将其右值参数转换为右值引用。
情况 2:传递左值
现在,有趣的是当使用左值(命名变量或计算结果的表达式)调用 std::move() 时,就会出现这种情况左值).
Object a; // a is lvalue Object b = std::move(a);
这次,移动模板实例化为:
// move with [T = Object&] remove_reference
同样,remove_reference
Object&& move(Object& && arg) { return static_cast
乍一看,这似乎违反直觉,因为我们传递了一个左值。然而,C 11引入了引用折叠的概念,它修改了引用语法的解释:
在这些规则下,Object& && 实际上表现为 Object&,一个可以绑定到左值的普通左值引用。
因此,函数的最终形式变为:
Object&& move(Object& arg) { return static_cast
本质上,std::move() 将左值参数转换为右值引用,从而无论输入类型如何都能实现完美转发。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3