例如,
void func(const int& a);
int main()
{
int b=1;
func(b*2);
}
如果const int&將傳遞一個參考,如何b*2成為一個參考?
所以這意味著它只傳遞b*2to的副本func()?
但如果是這樣,func(b)真的通過了 的參考b嗎?
我對嗎?
uj5u.com熱心網友回復:
&這個例子中的the確實表示一個參考,所以它必須參考一個實際的物件。
b*2在記憶體中創建一個臨時 int物件(右值)。當陳述句func(b*2);完成時(即;到達時),該臨時檔案將被銷毀。
當陳述句func(b*2)仍在運行時,臨時檔案仍然存在。對 const 的參考可以系結到臨時/右值物件,這就是代碼編譯和運行良好的原因。
但是,非常量參考不能系結到臨時/右值,只能系結到命名變數(左值)。因此,如果您要洗掉const(ie void func(int& a)),則該陳述句func(b*2)將不再編譯。
uj5u.com熱心網友回復:
這很簡單:
int b = 1;
這里,b是一個左值。因此,當您寫入時,您func( b )將左值傳遞給func. 它可以作業,因為func可以通過參考獲取左值。
但:
func( b*2 );
這里,b*2是一個純右值(它屬于右值類別),當您寫入時,您func( b*2 );將右值傳遞給func. 它有效,因為void func(const int& a);有一個const 左值參考引數,并且const 左值參考可以系結到右值。
現在,如果你重寫你的函式像這樣void func(const int&& a);這樣,只需要右值作為引數(另行通知&&),則func( b*2 )仍然會編譯,但func( b )不會因為b是一個左值和左值不能移動,除非你施放它的x值(這是也在右值和左值類別下)像這樣:
func( std::move( b ) )
簡而言之,std::move將左值轉換為xvalue以告訴編譯器它是臨時的,因此可以從中移動。
為了完整起見:
在 C 11 中,運算式:
- 有標識且不能移動的稱為左值運算式;
- 具有標識且可以移動的稱為 xvalue 運算式;
- 沒有身份并且可以從被稱為純右值(“純右值”)運算式中移動;
- 不具有身份且無法移出不使用。
具有恒等式的運算式稱為“glvalue 運算式”(glvalue 代表“廣義左值”)。左值和 x 值都是左值運算式。
可以移動的運算式稱為“右值運算式”。prvalues 和 xvalues 都是右值運算式。

檢查值類別以獲取更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/383754.html
上一篇:如何使用反應式物件創建函式?
