簡體   English   中英

將參數傳遞給函數作為 r 值引用與 const 左值引用

[英]Pass argument to function as r-value reference vs const l-value reference

讓我們考慮以下函數:

void processString1(const string & str) { /** **/}
void processString2(string && str) { /** **/}

processString1("Hello");
processString2("Hello");

正如我所假設的,processString1 將調用復制構造函數,而 processString2 將調用字符串的移動構造函數。 什么更有效?

你的理解在這里被誤導了。

首先,這兩個函數都不帶值——它們都帶引用。 因此,當一個對象被傳遞給任何一個時,都不會調用構造函數——任何傳遞的對象都只是綁定到一個引用。

但是,您的函數調用會傳遞一個 C 字符串 - 並且存在從 C 字符串到 std::string 的隱式轉換。

因此,每個人都將構造一個 TEMPORARY std::string our C 字符串“Hello”。

在第一種情況下,該臨時對象將綁定到 const 引用,在第二種情況下綁定到 rval-reference-to-non-const。

該語言保證臨時對象的生命周期至少在函數調用的生命周期內存在。

兩個函數調用都不做任何構造——唯一的構造發生在 C 字符串被隱式轉換為 std::string 的實例時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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