別)
答案沒有區(qū)別它們是同一個東西。“xvalue” 不是兩種不同的 xvalue一種屬于 rvalue、一種屬于 glvalue而是唯一一個同時被兩個大類都包含的基本類別——正因?yàn)樗瑫r滿足有 identity屬于 glvalue 的條件和可被移動屬于 rvalue 的條件這兩個性質(zhì)所以它天生就落在兩個大類的交集里。用之前提到的兩條正交性質(zhì)來看會更清楚有 identity能確定這個表達(dá)式指向的是不是同一個實(shí)體→ 滿足的叫g(shù)lvalue可被移動可以合法地把資源掏空→ 滿足的叫rvalue三個基本類別是這兩條性質(zhì)的三種實(shí)際組合第四種組合既無身份又不可移動在 C 里不存在因?yàn)橐粋€連身份都沒有的臨時值天然就是可以隨便處置、被移動的lvalue 有身份、不可移動xvalue 有身份、且可移動prvalue 沒身份、可移動所以當(dāng)說到xvalue 是 rvalue 的一種時指的是它滿足可移動這條性質(zhì)當(dāng)你說xvalue 也是 glvalue 的一種時指的是它同時滿足有身份這條性質(zhì)。兩句話描述的是同一批表達(dá)式只是分別強(qiáng)調(diào)了它具備的兩條性質(zhì)中的一條。這也正是標(biāo)準(zhǔn)專門發(fā)明 xvalue 這個類別的原因——C11 引入右值引用之后需要一個類別來描述這東西像左值一樣有身份所以std::move(x).x這種取成員、或者綁定T引用都合法但資源又可以像右值一樣被掏空std::move(x)正是這種情況的典型代表。