動機
自從多了move之後,C++就整個不一樣了。 變得十分的詭異,move與現在要講的這個 Value Categories。
定義一些關鍵字(以十分非正式的方式)
- identity: 變數,應該說有可以透過變數或是ptr存取到的東西
- object: class或是struct
架構
- expression
- glvaue
- lvalue
- xvalue
- rvalue
- prvalue
- xvalue
- glvaue
prvalue
沒有identity的資料,也就是沒有被assign或是與object的attr有關的資料
像
- literal(string是lvalue,他本身就是array,但不能改)
- lambda
- 沒有被assign的bject
- 臨時被造出來的object
xvalue
很快就會被搬空(&&, std::move)的變數(或是位置),或是臨時被造出來的object上的變數
主要xvalue就是變數,但很快就會消失,變數自身、裡面的資料
例子
struct X { int n; };
extern X x;
4; // prvalue: does not have an identity
// 如果宿主是lvalue,attr也是lvalue
x; // lvalue
x.n; // lvalue
std::move(x); // xvalue
std::forward<X&>(x); // lvalue
// 如果宿主是prvalue,attr會是xvalue
X{4}; // prvalue: does not have an identity
X{4}.n; // xvalue
lvalue
沒有被move的變數都是lvalue,另外function要看他的return type,如果是lvalue就是lvalue,不然就是prvalue
例子
X x; // x is an lvalue
X* px = &x; // px is an lvalue
*px = X{}; // *px is also an lvalue, X{} is a prvalue
X* foo_ptr(); // foo_ptr() is a prvalue, cuz X* is prvalue
X& foo_ref(); // foo_ref() is an lvalue, cuz X& is lvalue
lvalue & lvalue 與 prvalue & xvalue
可以用派生的感覺去看
lvalue的attr是lvalue (有變數去存)
prvalue的attr是xvalue (依附在沒有存在變數的資料上)
Ref
讓我看懂這到底是什麼鬼東西好文章,推爆 What are rvalues, lvalues, xvalues, glvalues, and prvalues?