左右值3

所有的具名变量或对象都是左值,而匿名变量则是右值.
右值引用类型是独立于值的,一个右值引用参数作为函数的形参,在函数内部再转发该参数的时候它已经变成一个左值了,并不是它原来的类型了。
在 C++11 之前,右值是不能被引用的,最大限度就是用常量引用绑定一个右值,如 :
const int &a = 1;
在这种情况下, 右值不能被修改的。但是实际上右值是可以被修改的,既然右值可以被修改,那么就可以实现右值引用。
实际上T&&并不是一定表示右值引用,它的引用类型是未定的,即可能是左值有可能是右值。
&&为universal references时的唯一条件是有类型推断发生。
template<typename T>
void f( const T&& param);
这个param是universal references吗?错,它是右值引用类型,也许会迷糊,T不是推断类型吗,怎么会是右值引用类型。
其实还有一条规则:universal references仅仅在T&&下发生,任何一点附加条件都会使之失效,而变成一个右值引用! 这里添加了const
具名的右值引用是左值,不具名的右值引用是右值。(将亡值的来源)
返回不具名的右值引用主要有两种情况:
1.static_cast<T&&> (t);
2.T&&  fun
{return t;}
正是因为返回了将亡值(不具名的右值引用),所以才可以把它们的返回值绑定到一个右值引用上.
如果它被一个右值初始化,它就是一个右值,它是左值还是右值取决于它的初始化。(联想到为模板元编程发明的引用折叠规则)。
需要注意的是,仅仅是当发生自动类型推导(如函数模板的类型自动推导,或auto关键字)的时候,T&&才是universal references。
没有自动类型推导的过程中,类型是确定的,是右值引用类型,只能绑定到一个右值上。
字面值常量中仅有字符串字面值是左值,可以用&取地址,其他的都是右值。
1 "abc"//左值,可以取地址
2 char* ptr = "abc";        //错误的写法
3 constchar* ptr = "abc";   //正确的写法
4 char a[] = "abc"; char* ptr = a;//正确的写法
5 constchar* ptr = & "abc"//错误的写法
 "abc"可以直接初始化指针const char*,指针的值为字符串"abc"的首字符a的地址,但不能直接初始化char* 指针。
而&("abc")被编译器编译为const的指向数组的指针const char (*) [4](之所以是4,是因为 编译器会在"abc"后自动加上一个'\0'),它不能初始化char *类型,即使是           const char *也不行

转载于:https://www.cnblogs.com/abelian/p/6029665.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值