最近看代码突然发现 诸如 “ int &&b“的类型声明,之前也见到过,可是没有注意过。按照C/C++的声明分析就是 “引用的引用,等同于引用“,不过最近看到一个函数std::move的获取右值引用的函数,才又重新审视这个问题。上面语句声明的 “b” 就是 右值引用类型
先解释一下右值,有地方说右值不可以取地址,不过vs2013亲测,能够取地址(当然不排除vs对于标准的不支持),代码如下:
class A {
public:
A ()
{
p = (int*)malloc(sizeof(int) );
}
private:
int *p ;
};
A getA() { return A(); }
A &&a = getA();
A *p = &getA();
有种说法比较符合实情:没有名字的都为右值。如函数返回值(包括对象的构造)。
那么右值引用的作用是什么呢:右值引用指向的对象是一种将要消逝的对象,如上面getA()的返回值。假如有如下代码:
A var = getA();
那么存在一次从函数返回值构造var的过程。但是如果类A中存在一个资源(p指向的一块动态内存),那么既然getA()的值马上要销毁,为何不把其内部的p所指向的内存直接交由var呢,从而减少一次资源申请呢
可以 为类A添加一个构造函数
A::A(A &&b)
{
p = b.p;
}
这样能够提高代码效率。C++11中有个模板函数std::move可以将一个左值(lvalue)值转为右值(rvalue)。下面是我的模拟实现
template <class T>
struct TypeGet {
typedef T Type;
};
template<class _Ty>
typename TypeGet<_Ty>::Type&& ref(_Ty& _Arg)
{
return (typename TypeGet<_Ty>::Type&&)_Arg;
}
//使用
A a;
A &&f = ref(a); //取右值