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