65,211
社区成员
发帖
与我相关
我的任务
分享[右值
右值表达式包括纯右值、亡值。
性质:
右值不能由内建的取址运算符取地址:&int()、&i++[3]、&42 及 &std::move(x) 是非法的。
右值不能用作内建赋值运算符及内建复合赋值运算符的左操作数。
右值可以用于初始化 const 左值引用,这种情况下该右值所标识的对象的生存期被延长到该引用的作用域结尾。
右值可以用于初始化右值引用,这种情况下该右值所标识的对象的生存期被延长到该引用的作用域结尾。
当被用作函数实参且该函数有两种重载可用,其中之一接受右值引用的形参而另一个接受 const 的左值引用的形参时,右值将被绑定到右值引用的重载之上(从而,当复制与移动构造函数均可用时,以右值实参将调用其移动构造函数,复制和移动赋值运算符与此类似)](https://zh.cppreference.com/w/cpp/language/value_category#.E5.8F.B3.E5.80.BC)
别的语言也应该有左右值之分,可能只是没有明确说明而已
例如
你可以写
c=a+b
但你不能写
a+b=c

class M{};
void f(M*){}
int main()
{
f(&M());
return 0;
}[/quote]为什么你会觉得 M()是一个右值? [/quote]
因为M()没有名字,所以我认为是一个右值
[/quote]
M()是一个临时对象也是一个右值,不应该这么使用[/quote]
同意,M()是一个右值,但是可以取地址,虽然不应该这样用。
所以不能说右值不能取地址。
[/quote]准确的说不应该对右值对象进行取址操作,首先右值对象确实是有存储空间的,但是这个空间是在内存还是寄存器你是不确定的,如果在寄存器你是不可能取地址的,即使在内存像这种临时对象的生命周期是有限的,就算取到地址也许那段内存里面的东西由于对象被销毁而变得无效
class M{};
void f(M*){}
int main()
{
f(&M());
return 0;
}[/quote]为什么你会觉得 M()是一个右值? [/quote]
因为M()没有名字,所以我认为是一个右值
[/quote]
M()是一个临时对象也是一个右值,不应该这么使用[/quote]
同意,M()是一个右值,但是可以取地址,虽然不应该这样用。
所以不能说右值不能取地址。
class M{};
void f(M*){}
int main()
{
f(&M());
return 0;
}[/quote]为什么你会觉得 M()是一个右值? [/quote]
因为M()没有名字,所以我认为是一个右值
[/quote]
M()是一个临时对象也是一个右值,不应该这么使用
class M{};
void f(M*){}
int main()
{
f(&M());
return 0;
}[/quote]为什么你会觉得 M()是一个右值? [/quote]
因为M()没有名字,所以我认为是一个右值
class M{};
void f(M*){}
int main()
{
f(&M());
return 0;
}[/quote]为什么你会觉得 M()是一个右值?
class M{};
void f(M*){}
int main()
{
f(&M());
return 0;
}