左值右值划分
C语言中:以等号操作符为基准,可以放在左边的为左值,仅可以放在右边的为右值。
C++中: 左值不一定能放在等号左侧,右值也可以放在等号左侧。
int const x = 4;//作为常整型不能放在左侧
struct Str
{
};
int main()
{
Str() = Str();//Str()是一个右值但是可以放在左侧做初始化
}
表达式分类
gvalue --> lvalue \ xvalue
rvalue --> prvalue \ xvalue
glvalue
泛左值,表达式中标识具体的内存位置。
prvalue
纯右值
- 计算某个运算符的操作数的值或void表达式,无返回结果
- 初始化某个对象或位阈
xvalue
将亡值,即将消亡,右值引用产生,其资源可以被重新使用
返回右值引用的表达式(方法和运算符重载),是消亡值,而不是纯右值
fun(std::vector<int>&& par)
{
}//x作为xvalue后续main函数中将不再使用
int main()
{
std::vector<int> x; x-->lvalue
fun(std::move(x)); //此时,x从lvalue-->xvalue
}
左值右值间的转化
decltype
引用
参考文章,及cppreference