C++中的右值引用"&&"

在查看STL源码过程中,看到有的函数的参数列表中,对参数前面有"&&"这样的修饰符。甚为不解。

在网上查阅了相关的信息,才发现,这是一种新的参数的引用方法,称之为“右值引用”,区别于左值引用的“&”。

参见MSDN-右值引用。这是VisualStudio2010中新增的支持特性

中文版的好像示例更多:右值引用-MSDN中文页面


举例来说,有如下代码:

#include <iostream>
#include <string>
using namespace std;

int main()
{
   string s = string("h") + "e" + "ll" + "o";
   cout << s << endl;
}

可以看出,string("h")在表达式中是一个右值。

显然,对string类应有重载的加号运算符,左操作数为string对象,右操作数为const char*,且加号运算符一般应作为友元函数实现。

一般的实现方法是,创建一个新的string对象tmp,然后把左右两边的值都复制到tmp中。这也是最一般的STL函数。如下:

template<class _Elem,
	class _Traits,
	class _Alloc> inline
	basic_string<_Elem, _Traits, _Alloc> operator+(
		const basic_string<_Elem, _Traits, _Alloc>& _Left,
		const _Elem *_Right)
	{	// return string + NTCS
	basic_string<_Elem, _Traits, _Alloc> _Ans;
	_Ans.reserve(_Left.size() + _Traits::length(_Right));
	_Ans += _Left;
	_Ans += _Right;
	return (_Ans);
	}

然而,在有右值引用的基础上,我们就可以重载一个函数,专门为右值的左操作数服务。此时,如果左操作数是右值,那么就可以把右操作数直接附加在左操作数的后面。

如下:

template<class _Elem,
	class _Traits,
	class _Alloc> inline
	basic_string<_Elem, _Traits, _Alloc> operator+(
		basic_string<_Elem, _Traits, _Alloc>&& _Left,
		const _Elem *_Right)
	{	// return string + NTCS
	return (_STD move(_Left.append(_Right)));
	}
在无法判断左右值的情况下,不能直接附加。因为如果左操作数是左值的话,我们不应该对它进行任何修改。





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++右值引用可以用于循环右值引用是一种特殊的引用类型,它可以绑定到临时对象(右值)上,这些临时对象通常是在表达式求值或函数返回时创建的。 在循环使用右值引用可以提高性能,尤其是在处理大型数据结构或需要移动语义的情况下。通过将临时对象的所有权转移给右值引用,可以避免不必要的拷贝操作,并减少内存分配和释放的开销。 例如,考虑以下代码: ```cpp std::vector<int> createVector() { std::vector<int> vec; // 假设此处有一些代码来填充向量 return vec; } void processVector(std::vector<int>&& vec) { // 对向量进行处理 } int main() { for (int i = 0; i < 10; ++i) { processVector(createVector()); } return 0; } ``` 在上面的代码,`createVector()` 函数返回一个 `std::vector<int>` 类型的临时对象,而 `processVector()` 函数接受一个右值引用参数。在循环,我们多次调用 `createVector()` 来创建临时对象,并将其转移给 `processVector()` 函数进行处理。 通过使用右值引用,我们避免了不必要的拷贝操作,提高了性能。需要注意的是,右值引用参数在函数内部的生命周期可能会超过函数的作用域,因此在使用时要谨慎确保不会访问已经失效的对象。 总结起来,右值引用在循环的使用可以提高性能,特别是在处理临时对象和使用移动语义时。但在使用时要注意生命周期的管理,以避免访问已经失效的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值