1. 程式人生 > >C++中的右值引用"&&"

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

在檢視STL原始碼過程中,看到有的函式的引數列表中,對引數前面有"&&"這樣的修飾符。甚為不解。

在網上查閱了相關的資訊,才發現,這是一種新的引數的引用方法,稱之為“右值引用”,區別於左值引用的“&”。

參見MSDN-右值引用。這是VisualStudio2010中新增的支援特性

舉例來說,有如下程式碼:

#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)));
	}
在無法判斷左右值的情況下,不能直接附加。因為如果左運算元是左值的話,我們不應該對它進行任何修改。