動機

自從多了move之後,C++就整個不一樣了。 變得十分的詭異,move與現在要講的這個 Value Categories。

定義一些關鍵字(以十分非正式的方式)

  • identity: 變數,應該說有可以透過變數或是ptr存取到的東西
  • object: class或是struct

架構

  • expression
    • glvaue
      • lvalue
      • xvalue
    • rvalue
      • prvalue
      • xvalue

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?