【轉】int && 非常量右值

來源:互聯網
上載者:User

標籤:

C++ 11中引入的右值引用正好可用於標識一個非常量右值。C++ 11中用&表示左值引用,用&&表示右值引用,如:

int &&a = 10

右值引用根據其修飾符的不同,也可以分為非常量右值引用和常量右值引用。

 

 

C++ 11中引入的一個非常重要的概念就是右值引用。理解右值引用是學習“移動語意”(move semantics)的基礎。而要理解右值引用,就必須先區分左值與右值。

對左值和右值的一個最常見的誤解是:等號左邊的就是左值,等號右邊的就是右值。左值和右值都是針對錶達式而言的,左值是指運算式結束後依然存在的持久對象,右值是指運算式結束時就不再存在的臨時對象。一個區分左值與右值的便捷方法是:看能不能對錶達式取地址,如果能,則為左值,否則為右值。下面給出一些例子來進行說明。

1 int a = 10  2 int b = 20  3 int *pFlag = &a;  4 vector<int> vctTemp;  5 vctTemp.push_back(1);  6 string str1 = "hello "  7 string str2 = "world"  8 const int &m = 1  

 

請問,a,b, a+b, a++, ++a, pFlag, *pFlag, vctTemp[0], 100, string("hello"), str1, str1+str2, m分別是左值還是右值?

a和b都是持久對象(可以對其取地址),是左值;

a+b是臨時對象(不可以對其取地址),是右值;

a++是先取出持久對象a的一份拷貝,再使持久對象a的值加1,最後返回那份拷貝,而那份拷貝是臨時對象(不可以對其取地址),故其是右值;

++a則是使持久對象a的值加1,並返回那個持久對象a本身(可以對其取地址),故其是左值;

pFlag和*pFlag都是持久對象(可以對其取地址),是左值;

vctTemp[0]調用了重載的[]操作符,而[]操作符返回的是一個int &,為持久對象(可以對其取地址),是左值;

100和string("hello")是臨時對象(不可以對其取地址),是右值;

str1是持久對象(可以對其取地址),是左值;

str1+str2是調用了+操作符,而+操作符返回的是一個string(不可以對其取地址),故其為右值;

m是一個常量引用,引用到一個右值,但引用本身是一個持久對象(可以對其取地址),為左值。

區分清楚了左值與右值,我們再來看看左值引用。左值引用根據其修飾符的不同,可以分為非常量左值引用和常量左值引用。

非常量左值引用只能綁定到非常量左值,不能綁定到常量左值、非常量右值和常量右值。如果允許綁定到常量左值和常量右值,則非常量左值引用可以用於修改常量左值和常量右值,這明顯違反了其常量的含義。如果允許綁定到非常量右值,則會導致非常危險的情況出現,因為非常量右值是一個臨時對象,非常量左值引用可能會使用一個已經被銷毀了的臨時對象。

常量左值引用可以綁定到所有類型的值,包括非常量左值、常量左值、非常量右值和常量右值。

 

(1)非const左值引用只能綁定到非const左值;
(2)const左值引用可綁定到const左值、非const左值、const右值、非const右值;
(3)非const右值引用只能綁定到非const右值;
(4)const右值引用可綁定到const右值和非const右值。

 

大致意思是:模板參數的推導其實就是形參和實參的比較和匹配,如果形參是一個參考型別(如P&),那麼就使用P來做類型推導;如果形參是一個cv-unqualified(沒有const和volatile修飾的)右值參考型別(如P&&),並且實參是一個左值(如類型A的對象),就是用A&來做類型推導(使用A&代替A)。

template <class _Tp> void f(_Tp &&amp  { /* do something */ }
template <class _Tp> void g(const _Tp &&amp  { /* do something */ }
int x = 123;
f(x);   // ok,f()模板函數形參為非const非volatile右值參考型別,實參x為int類型左值,使用int&來做參數推導,因此調用f<int &>(int &amp 
f(456); // ok,實參為右值,調用f<int>(int &&amp 
g(x);   // error,g()函數模板參數為const右值參考型別,會調用g<int>(const int &&amp ,通過右值引用規則四可知道,const右值引用不能綁定到左值,因此會導致編譯錯誤

原文地址:http://blog.csdn.net/yuanwang1986/article/details/8666459

【轉】int && 非常量右值

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.