簡體   English   中英

const int& 是否傳遞了引用或副本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM