C 併發程式設計 附錄A 右值引用 01

2021-10-03 11:05:54 字數 1432 閱讀 4855

author:

int var=42;

int& ref=var; // 左值引用

ref=99;

assert(var==99);

左值和右值.

從簡單來說左值就是在記憶體中有確定位址,長期貯存的元素.而右值普遍是臨時物件.雖然在記憶體中存在,但是只是臨時的.比如常亮

const char* p = "hello"; 

const int i=42;

其中hello,42就是典型的右值.(左值引用只能引用左值物件,右值引用只能引用右值物件.),如下面就會報錯.

int& i = 42; // 編譯報錯.
可是你還是可以繫結到乙個const型的左值引用(這是意外的情況,因為const的左值引用要特別重要)

int const& i = 42;
c++11引入了右值引用

int&& i=42;

int j=42;

int&& k=j;

void process_copy(std::vector&& vec)

vectortest;

test.push_back(10);

//process_copy(test);// 報錯

process_copy(std::move(test))//test被掏空之後,最好不要使用test了.

class x

~x()

x(const x& other):

data(new int[1000000])

x(x&& other):

data(other.data)

};

很多物件都是不能複製的,只能move

x x1;

x x2=std::move(x1);

x x3=static_cast(x2); // 這種搞法也可以

再比如

std::thread, std::unique_lock<>, std::future<>, std::promise<>, and std::packaged_task<>
都是不能拷貝的,只能move

templatevoid foo(t&& t)

{}foo(42);

foo(3.14159);

foo(std::string());

int i=42;

foo(i); // ok!. t被推斷為int& 所以int& &&變成了int&. void foo(int& t);//為什麼這樣?這是c++的規則 (t&& && -> t&&) and (t& && -> t&).

C 程式設計高階 右值引用

右值引用 rvalue reference 是c 程式語言自c 11標準提出的一類資料型別。用於實現移動語義 move semantic 與完美 perfect forwarding 作為一種追求執行效率的語言,c 在用臨時物件或函式返回值給左值物件賦值時的深度拷貝 deep copy 一直受到詬病...

c 左值 右值 右值引用 左值引用

c 裡一切值必須屬於左值 右值兩者之一。左值 一切變數 包括用const修飾的變數 物件 包括引用都屬於左值 右值 一切字面值 可以是巨集 臨時無名物件 函式返回值 表示式 如a n 說明一下 函式返回值,返回的是某乙個型別的值,並不是返回變數。左值並不是說能放在 左邊的值就是左值 雖然用const...

c 左值 右值 左值引用 右值引用

在c語言中,左值認為是賦值語句的左側,右值認為是賦值語句的右側。在c 中,意義稍有不同。c 中,每乙個表示式會產生乙個左值或者右值,相應的,該表示式也就被稱作 左值表示式 右值表示式 乙個左值表示式的求值結果是乙個物件或者是乙個函式。左值可以當右值使用,而右值不能當左值使用。c prime 中這麼簡...