這篇文章主要講解了“c++11 左值引用和右值引用的用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“c++11 左值引用和右值引用的用法”吧!
左值是表達式結束后依然存在的持久對象,既能出現在等號左邊也能出現在等號右邊的變量或表達式
右值是因為聲明結束后會被銷毀,所以不能放在等號左邊
#include <iostream>
using namespace std;
void Print(string& s){
cout << s;
}
int main(){
string s="abc";
Print(s); // OK
Print("abc"); // parse error
}&是c++里的左值引用
&&是c11里的右值引用
右值只能被const引用指向,在這時,右值的生命周期被延長了,直到引用銷毀。
因為右值只能被const引用指向,所以我們才會在拷貝構造函數和賦值函數形參內加上const(還有一個原因是避免參數被修改),這里c11出現了一個特殊智能指針的non const拷貝構造函數
string Proc()
{
return string("abc");
}
int main()
{
const string& ref = Proc();
//此時右值的生命周期延長了,直到main函數結束
cout << ref << endl;
return 0;
}使用std::move()接受一個參數,返回該參數對應的右值引用
template<typename _Tp>
inline typename std::remove_reference<_Tp>::type&& move(_Tp&& __t)
{
return static_cast<typename std::remove_reference<_Tp>::type&&>(__t);
}
static_cast是一個強制類型轉換符,強制類型轉換會告訴編譯器:我們知道并且不會在意潛在的精度損失。//下面有一個move使用的小例子
void swap(T& a, T& b)
{
T tmp = move(a);
a = move(b);
b = move(tmp);
//可以看出相比較之前的進行了多次資源拷貝、銷毀的swap
//在swap里使用move只是進行了三次的指針交換,效率提升
}forward()接收一個參數,返回該參數本來所對應的類型的引用。(即完美轉發)
#include <iostream>
//#include <utility> //for std::forward
using namespace std;
void print(const int& t)
{
cout <<"lvalue" << endl;
}
void print(int&& t)
{
cout <<"rvalue" << endl;
}
template<typename T>
void Test(T&& v) //v是Universal引用
{
//不完美轉發
print(v); //v具有變量,本身是左值,調用print(int& t)
//完美轉發
print(std::forward<T>(v)); //按v被初始化時的類型轉發(左值或右值)
//強制將v轉為右值
print(std::move(v)); //將v強制轉為右值,調用print(int&& t)
}
int main()
{
cout <<"========Test(1)========" << endl;
Test(1); //傳入右值
int x = 1;
cout <<"========Test(x)========" << endl;
Test(x); //傳入左值
cout <<"=====Test(std::forward<int>(1)===" << endl;
Test(std::forward<int>(1)); //T為int,以右值方式轉發1
//Test(std::forward<int&>(1)); //T為int&,需轉入左值
cout <<"=====Test(std::forward<int>(x))===" << endl;
Test(std::forward<int>(x)); //T為int,以右值方式轉發x
cout <<"=====Test(std::forward<int&>(x))===" << endl;
Test(std::forward<int&>(x)); //T為int,以左值方式轉發x
return 0;
}
/*輸出結果
e:\Study\C++11\16>g++ -std=c++11 test2.cpp
e:\Study\C++11\16>a.exe
========Test(1)========
lvalue
rvalue
rvalue
========Test(x)========
lvalue
lvalue
rvalue
=====Test(std::forward<int>(1)===
lvalue
rvalue
rvalue
=====Test(std::forward<int>(x))===
lvalue
rvalue
rvalue
=====Test(std::forward<int&>(x))===
lvalue
lvalue
rvalue
*/感謝各位的閱讀,以上就是“c++11 左值引用和右值引用的用法”的內容了,經過本文的學習后,相信大家對c++11 左值引用和右值引用的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。