65,211
社区成员
发帖
与我相关
我的任务
分享
int&& a=100;//右值引用(c++11起)绑定一个纯右值。
a=10;//ok
右值
右值表达式包括纯右值、亡值。
性质:
右值不能由内建的取址运算符取地址:&int()、&i++[3]、&42 及 &std::move(x) 是非法的。
右值不能用作内建赋值运算符及内建复合赋值运算符的左操作数。
右值可以用于初始化 const 左值引用,这种情况下该右值所标识的对象的生存期被延长到该引用的作用域结尾。
右值可以用于初始化右值引用,这种情况下该右值所标识的对象的生存期被延长到该引用的作用域结尾。
当被用作函数实参且该函数有两种重载可用,其中之一接受右值引用的形参而另一个接受 const 的左值引用的形参时,右值将被绑定到右值引用的重载之上(从而,当复制与移动构造函数均可用时,以右值实参将调用其移动构造函数,复制和移动赋值运算符与此类似)。
(C++11 起)
参考16楼boot_black的回复,并且我也重翻了C++ Primer。
C++的内置数据类型作为右值,的确是不可修改的,也不可再被赋值(=);但是C++ Primer中没有说 类类型作为右值,是常量,是不可修改的,不论是C++旧标准还是C++11都是允许类类型的右值被赋值,例如std::string就是如此。类类型的右值的确是临时变量,但是类类型的临时变量是可以调用成员函数的,包括(operator=)赋值运算符重载函数,这体现在代码上就是:类类型的临时变量可以赋值。
当然,你可以尝试把(operator=)设置成删除的函数delete,这样的话,就不可以对类类型的临时变量赋值;或者你令一个函数返回const的类类型临时变量,也是无法调用(operator=)进行赋值的。
所以,右值引用可以被修改,也可以是不能被修改(const修饰)。
[/quote]寄存器变量[/quote]多谢
[/quote]寄存器变量