[C++]11版本新特性2:左值、右值引用、完美转发

您所在的位置:网站首页 c++中左值引用和右值是什么意思 [C++]11版本新特性2:左值、右值引用、完美转发

[C++]11版本新特性2:左值、右值引用、完美转发

2024-07-17 06:42| 来源: 网络整理| 查看: 265

引入

本文接着来介绍cpp11更新的一些新特性 提前说明一下,左值引用和右值引用都是对于对象取别名

左值引用与右值引用 左值引用

我们一般情况下可以对其进行取地址,并且还可以对其进行赋值,左值可以出现在等号的左边

给出一段例子

int main() { // 以下的p、b、c、*p都是左值 int* p = new int(0); int b = 1; const int c = 2; // 以下几个是对上面左值的左值引用 int*& rp = p; int& rb = b; const int& rc = c; int& pvalue = *p; return 0; } 右值引用 右值 右值与左值相同(都是一个数据的表达式)字面常量、表达式返回值、返回值不是左值引用的函数返回值(临时对象)右值不能取地址 int main() { double x = 1.1, y = 2.2; // 以下几个都是常见的右值 10; x + y; min(x, y); // 以下几个都是对右值的右值引用 int&& rr1 = 10; double&& rr2 = x + y; double&& rr3 = min(x, y); // 这里编译会报错:error C2106: “=”: 左操作数必须为左值 //10 = 1; x + y = 1; //min(x, y) = 1; return 0; } 二者比较 语法上的区别就是一个&和两个&二者都是取别名,不消耗额外空间左值引用指针存储的是当前左值的地址右值引用先把右值拷贝到栈上的一个临时空间,然后其指针存储这个临时空间的地址 左值引用 左值引用只能引用左值const左值引用可以引用右值 右值引用 右值引用只能引用右值右值引用可以引用move后的左值 int main() { // 右值引用只能右值,不能引用左值。 int&& r1 = 10; // error C2440: “初始化”: 无法从“int”转换为“int &&” // message : 无法将左值绑定到右值引用 //int a = 10; //int&& r2 = a; // 右值引用可以引用move以后的左值 int&& r3 = std::move(a); return 0; } 右值引用的意义 左值引用的使用场景

一般用作参数和返回值

void func1(bit::string s){} void func2(const bit::string& s){} int main() { bit::string s1("hello world"); // func1和func2的调用我们可以看到左值引用做参数减少了拷贝,提高效率的使用场景和价值 func1(s1); func2(s1); // string operator+=(char ch) 传值返回存在深拷贝 // string& operator+=(char ch) 传左值引用没有拷贝提高了效率 s1 += '!'; return 0; }

短板: 当其返回值为临时对象,出了作用域就不存在了,所以无法用左值引用,这样就会导致至少一次的拷贝构造

右值引用的使用场景 移动构造

我们可以用右值引用和移动语义来解决多出的拷贝构造

我们在类中增加移动构造函数,目的是窃取要拷贝对象的资源,这样就不需要深拷贝了,减少了资源的浪费

// s1.swap(s2) void swap(string& s) { ::swap(_str, s._str); ::swap(_size, s._size); ::swap(_capacity, s._capacity); //这里的::意思是 //::swap 意味着调用全局命名空间中的 swap 函数,而不是当前命名空间中的 swap 函数。 } // 移动构造 string(string&& s) :_str(nullptr) , _size(0) , _capacity(0) { cout


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3