对 std::move 到右值转换的扩展理解
在 C 语言中,std::move() 在转换表达式中起着至关重要的作用到右值(右值引用)。然而,它的实现可能令人难以理解。本文旨在提供对 move 函数及其在左值和右值下的行为的清晰理解。
std::move() 的实现
std ::move() 函数在 MSVC 标准库中实现,采用右值引用 (&&) 参数并返回右值引用。这允许 std::move() 有效地处理左值(左值引用)和右值。
右值绑定
当 std::move() 为使用右值(例如临时对象)调用时,_Arg 引用参数直接绑定到右值。这很简单,因为右值引用可以绑定到右值。
左值绑定
当使用左值调用 std::move() 时,_Arg 引用参数绑定到左值引用 (Object&)。这就提出了右值引用如何绑定到左值的问题。
引用折叠
要理解这种行为,我们需要考虑 C 11 的引用折叠规则。这些规则规定:
Object & & = Object & Object & && = Object & Object && & = Object & Object && && = Object &&
根据这些规则,Object& && 相当于 Object&,它是一个可以绑定到左值的普通左值引用。
remove_reference 的效果
std::move() 使用 std::remove_reference 删除任何现有的来自参数类型的引用,产生类型名 tr1::_Remove_reference
实现的优点
std:: 的实现move() 有几个优点:
结论
std::move() 的实现经过精心设计,可以有效地将表达式转换为右值,并通过引用处理左值和右值折叠并确保一致的右值引用返回类型。这种机制在 C 中移动语义的使用中起着至关重要的作用。
以上是std::move() 如何在 C 中将左值转换为右值?的详细内容。更多信息请关注PHP中文网其他相关文章!