如果我没记错的话,我认为 const 引用和右值引用都可以绑定到右值。返回前者的函数和返回后者的函数之间有什么实际区别吗?
编辑。我无法修改前者,但为什么我会对修改右值感兴趣?是否有意义?
A const
左值引用可以绑定到任何东西。右值引用只能绑定到非const
右值。
non-const lvalue const lvalue non-const rvalue const rvalue
const T& yes yes yes yes
T&& no no yes no
正如您所看到的,它们非常不同。
此外,如果函数调用返回左值引用,则该表达式是左值,但如果函数调用返回对象的右值引用,则该表达式是xvalue。
如果结果类型是左值引用类型或对函数类型的右值引用,则函数调用是左值;如果结果类型是对对象类型的右值引用,则函数调用是 xvalue;否则是纯右值。
至于何时想要修改右值 - 这正是移动语义的全部内容。考虑以下函数调用:
void func(std::string);
func(std::string("Hello"));
表达方式std::string("Hello")
是创建临时对象的右值。当初始化时std::string
带有此右值的参数,它将选择采用右值引用的构造函数 -移动构造函数。然后,该构造函数从右值中窃取内容,这通常比执行完整复制要快得多。我们可以从中偷窃,因为我们know这是暂时的。
至于什么时候该回来const
左值引用或右值引用:
返回一个const
当您想要授予读取“内部”对象(可能是类的成员)的访问权限,但不允许人们修改它时,最常使用左值引用。
-
当您希望允许调用代码从“内部”对象(可能是类的成员)移动时,返回右值引用是最常用的(根本不常见)。因此,它们不是从临时返回的对象中移动(就像按值返回时那样),而是从字面上从内部对象中移动。
这也可以通过非const
左值引用,但随后他们必须显式地std::move
it.
因此,您不太可能需要返回右值引用。
不是那个std::forward http://en.cppreference.com/w/cpp/utility/forward有一个返回类型看起来像T&&
。然而,这是具有欺骗性的,因为它可能是也可能不是右值引用,具体取决于T
. See 通用参考 http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)