C++中的右值引用"&&"
阿新 • • 發佈:2019-01-06
在檢視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))); }