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 中這麼簡...