C++ 值类别
一、两条轴
C++11 起按“有无身份”和“可否移动”划分:有身份=glvalue,可移动=rvalue,两者交集就是 xvalue(如 std::move(x) 的结果);普通临时量是 prvalue。

二、为什么重要
非 const 左值引用 T& 只能绑左值,const T& 可延命临时量,T&& 优先绑右值从而选中移动/转发重载;具名右值引用变量本身仍是左值,所以转发前要再 move/forward。
常见坑
- “右值引用变量是右值”——错,它有名字就是左值。
- 把 prvalue 当成必定物化的临时对象(C++17 有强制拷贝消除)。
- 用
std::move一个本想继续读的 const 对象,退回拷贝。
小结
总结
值类别是表达式(不是变量)的属性,C++11 起按"有无身份"(glvalue)和"可否移动"(rvalue)两条轴划分,两者交集 xvalue 即 std::move(x) 的结果、普通临时量是 prvalue;它决定表达式绑到哪种引用——非 const 的 T& 只绑左值、const T& 可延命临时量、T&& 优先绑右值从而选中移动/转发重载;关键误区是"具名的右值引用变量本身仍是左值",所以再传递前必须重新 std::move/forward。