C 函式傳參的時候,右引(T )和常引(const T )接收的引數有什麼不同,分別該什麼時候用?

時間 2021-05-05 21:04:44

1樓:歐文韜

舉個簡單的例子。比如std::string裡存了乙個很大的字串資料塊。

內部維護了乙個資料塊的指標和長度對吧?假設你要傳遞這個std::string到其他的地方儲存,如果函式傳過來的是 std::

string&&,那構造新 std::string 的時候直接空值構造,然後swap一下這個指標和長度就行了。如果傳入的是 const std::

string& 那就只能複製這個很大的記憶體塊。

2樓:

右值引用傳入使用場景就是移動建構函式。

定義之後就會移動右值,而拷貝左值。

如果沒定義移動建構函式,右值也會呼叫拷貝建構函式,也會被拷貝。

另外,右值引用是可以修改物件的,而通常的常量左值引用是不可以修改的。

我的理解是這種情況下就是為了形成兩種並列的情況,右引和常引各司其職,而避免出現單純的普通左值引用修改物件的用法。

3樓:C十十20年

C++新標準強調名與值,說簡單點就是有址與無址,變數有名也有址,常量在組合語言叫立即數,因此,常量無名也無址。T&&將匹配常量物件實參,用於實現移動移義(既然常量是立即數,用完即扔,何不將其內部例項成員指標分配的記憶體移動給其它物件,此所謂的移動語義),T&用於匹配有名有址實參,在深拷貝構造和深拷貝賦值時使用。何時需要深拷貝?

當物件內部有指標型別的例項資料成員時。不要被某些厚書把人搞苕了,經常看到類例項成員無指標定義T&和T&&的,並不會帶來多大效率提公升。不過,不全是沒有名字的,就不是C++新標準的Lvalue,例如,int &x=*new int(8); 等號右邊的表示式一定是個Lvalue。

建議看看《C++程式設計精要教程》

4樓:小島上的做題家

程式語言裡有乙個在C++裡不突出概念,就是variable bindings。本質上名字和值是不同的概念,我們把乙個名字bind給乙個值,乙個值可以有n個名字。

std::

stringa=

"abc"

;const

std::

string

&immmutableName=a

;std

::string

&mutableName=a

;std

::string

&&moveableName

=std

::move(a

);// move之後理論上你可以偷走a的值,所以在這之後你不能假設值沒有被偷走,儘管它沒有被偷走。

// 究竟有沒有被偷走,取決於你把它傳去的那個函式有沒有偷這個動作,但你不能假設它沒被偷。

暫時忘記記憶體或者指標,這裡「abc」是乙個值,a是我們bind 給它的名字。

immutableName是我們給它的另乙個名字,通過這個名字可以找到這個值但不能改變這個值。

MutableName是第三個我們給它的名字,通過這個名字可以找到這個值且可以改變這個值。

MoveableName是我們給這個值的第四個名字,用這個名字找它我們甚至可以偷走這個值。

所以,不同的reference僅僅是對同乙個值的不同的名字,本質上他們是乙個值。不同的名字代表著不同的許可權(注意是代表,有些名字比如非const左值引用本身沒有許可權控制的能力,你可以偷它的值)。

比如你想偷走它的值,&&會幫你匹配到

void

steal

(std

::string

&&str

)steal

(moveableName

);// 這個函式就是說,我需要乙個可以允許我偷值的許可權, 你通過這個名字的許可權,知道了你可以偷走這個值

如果你只是想用這個值,左值引用會幫你找到

void

read

(const

std::

string

&str

)// 你通過這個名字的許可權,知道了你只能讀這個值。

值永遠都是那個值,只不過不同的reference代表著不同許可權,但是指向同乙個值的名字而已。

這個右值ref只是個君子協定,右值ref進來你可以不偷,左值mutable ref進來你也可以用cast成move來偷。但無論偷還是沒偷,按照標準你都不能假設它沒被偷。按程式語言的話說他的name是valid的,但value是undefined,按c++原話說這個變數是in valid but unspecified state。

C 11的std function作為函式引數時應該以哪種方式傳參?是否要視情況而定?

菊花三弄 如果你是想把function 放容器裡,用常量引用,插入容器的時候拷貝一次。如果你想把function 放到其他執行緒執行,用傳值 歐文韜 第二部分是std function的實現原理所以你就看你的場景能不能接受function的複製代價,不能的話就const reference,最省事 ...

c語言中,形參就是變數嗎?為什麼說函式的形參可以是指標型別?

C語言答疑課堂 別說形參了,實參也是變數,傳遞給函式的引數都是變數。指標也是一種變數,跟int變數,char變數一樣,都是變數。既然都是變數,函式大爺全然接受。 形參就是函式的引數 什麼是引數?比如你在dos下敲個命令dir如果目錄太多的話一螢幕顯示不完。那麼敲 dir p就可以分屏顯示,這個 p就...

C語言 如何在函式體內,自動判斷傳入的陣列引數的長度。

飛著走的魚 裸陣列 內建 不可以判斷,陣列長度需要傳遞進去。這算是C語言本身的一種風格 要獲得可以判斷長度的陣列,需要自己設計陣列型別,用struct定義,並使用動態分配記憶體。 孔乙己 main函式的一般形式是 main int argc,char argv argc就是後邊那個argv陣列的個數...