左值 lvalue 是有識別符號、可以取位址的表示式,最常見的情況有:變數、函式或資料成員的名字返回左值引用的表示式,如 ++x、x = 1、cout << 』 '字串字面量如 "hello world"在函式呼叫時,左值可以繫結到左值引用的引數,如 t&。乙個常量只能繫結到常左值引用,如 const t&。
反之,純右值 prvalue 是沒有識別符號、不可以取位址的表示式,一般也稱之為「臨時物件」。最常見的情況有:返回非引用型別的表示式,如 x++、x + 1、make_shared(42)除字串字面量之外的字面量,如 42、true
函式呼叫時:
左值: 可以繫結到左值引用的引數,如 t&
右值: 在 c++11 之前,右值可以繫結到常左值引用,如 const t&
左值引用: t&
右值引用: t&&
右值引用作用:
右值引用主要作用是解決大物件在作為函式返回值返回時的深度拷貝問題,以及大物件之間的快速複製。
void
process_value
(int
& i)
void
process_value
(int
&& i)
intmain()
執行結果 :
lvalue processed:
0rvalue processed:
1
對於乙個實際的型別 t,它的左值引用是 t&,右值引用是 t&&。
那麼:是不是看到 t&,就一定是個左值引用?是不是看到 t&&,就一定是個右值引用?
對於前者的回答是「是」,對於後者的回答為「否」
引用摺疊規則:
void
foo(
const shape&
)void
foo(shape&&
)void
bar(
const shape& s)
void
bar(shape&& s)
intmain()
輸出為:
bar(shape&&
)foo
(const shape&
)
std::move基本等同於乙個型別轉換:
提高 swap 函式的的效能上非常有幫助
template
<
class
t>
swap
(t& a, t& b)
有了 std::move,swap 函式的定義變為 :
template
<
class
t>
swap
(t& a, t& b)
std::move()優點:完美**實現了引數在傳遞過程中保持其值屬性的功能,即若是左值,則傳遞之後仍然是左值,若是右值,則傳遞之後仍然是右值。
foo
(string&& member)
: member
std::move()和std::forward()對比 c 左值與右值
在學c 過程中,左值與右值的概念是一道繞不過去的坎,因此就想寫一些自己的理解。左值 lvalue 與右值 rvalue 是c 語法中的術語 terms 第一次看到這兩個詞的時候,很自然就認為在乙個表示式中,在等號左邊的就是左值,在等號右邊的就是右值。如果你們第一次看到這兩個詞也這麼認為的話,那我要恭...
C 左值與右值
左值 lvalue 和右值 rvalue 是 c c 中乙個比較晦澀基礎的概念,不少寫了很久c c 的人甚至沒有聽過這個名字,但這個概念到了 c 11 後卻變得十分重要,它們是理解 move forward 等新語義的基礎。左值與右值這兩概念是從 c 中傳承而來的,在 c 中,左值指的是既能夠出現在...
C 左值與右值
乙個很常見的誤區就是左值時等號左邊的值,右值時等號右邊的值 含義 左值是指表示式結束後依然存在的持久化物件 右值是指表示式結束時就不再存在的臨時物件 左值是儲存單元內的值,即是有實際儲存位址的 右值則不是儲存單元內的值,比如它可能是暫存器內的值也可能是立即數。下圖取自乙個知乎的回答 看幾個例子 in...