![](/img/trans.png)
[英]C++ and QT4.5 - is passing a const int& overkill? Does pass by reference helps in signals/slots?
[英]did const int& pass a reference or a copy
例如,
void func(const int& a);
int main()
{
int b=1;
func(b*2);
}
如果const int&
將傳遞一個引用,那么b*2
怎么能是一個引用?
所以這意味着它只將b*2
的副本傳遞給func()
?
但如果是這樣, func(b)
真的傳遞了b
的引用嗎?
我對嗎?
此示例中的&
確實表示引用,因此它必須引用實際的 object。
b*2
在 memory (右值)中創建一個臨時int
object。 當語句func(b*2);
完成(即,當到達;
時),該臨時將被銷毀。
雖然語句func(b*2)
仍在運行,但臨時仍然存在。 對常量的引用可以綁定到臨時/右值 object,這就是代碼編譯和運行良好的原因。
但是,非常量引用不能綁定到臨時/右值,只能綁定到命名變量(左值)。 因此,如果您要刪除const
(即void func(int& a)
),那么語句func(b*2)
將不再編譯。
這很簡單:
int b = 1;
這里, b
是一個左值。 因此,當您編寫func( b )
時,您將左值傳遞給func
。 它可以工作,因為func
可以通過引用獲取左值。
但:
func( b*2 );
這里, b*2
是一個純右值(在右值類別下),當你寫func( b*2 );
然后你將一個右值傳遞給func
。 它從void func(const int& a);
有一個const 左值引用參數,並且const 左值引用可以綁定到右值。
現在,如果你像這樣重寫你的 function void func(const int&& a);
所以它只將右值作為它的參數(注意&&
),然后func( b*2 )
仍然可以編譯,但func( b )
不會因為b
是一個左值並且左值不能移動,除非你將它轉換為xvalue (也屬於右值和左值類別)如下:
func( std::move( b ) )
簡而言之, std::move
將左值轉換為xvalue ,以告訴編譯器它是臨時的,因此可以從中移動。
為了完整起見:
在 C++11 中,表示:
- 有身份且不能被移動的稱為左值表達式;
- 具有身份並且可以從中移動的稱為 xvalue 表達式;
- 沒有身份並且可以從中移動的稱為prvalue(“純右值”)表達式;
- 沒有身份,不能從不使用。
具有同一性的表達式稱為“glvalue 表達式”(glvalue 代表“廣義左值”)。 lvalues 和 xvalues 都是 glvalue 表達式。
可以從中移動的表達式稱為“右值表達式”。 prvalues 和 xvalues 都是右值表達式。
檢查值類別以獲取更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.