深圳高端网站案例,怎么建网站做,响应式网站怎么改,网络推广营销软件简介#xff1a; CSDN博客专家#xff0c;专注Android/Linux系统#xff0c;分享多mic语音方案、音视频、编解码等技术#xff0c;与大家一起成长#xff01; 优质专栏#xff1a;Audio工程师进阶系列【原创干货持续更新中……】#x1f680; 人生格言#xff1a; 人生… 简介 CSDN博客专家专注Android/Linux系统分享多mic语音方案、音视频、编解码等技术与大家一起成长 优质专栏Audio工程师进阶系列【原创干货持续更新中……】 人生格言 人生从来没有捷径只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注Android系统攻城狮 1.前言 本篇目的理解C之lambda匿名函数、typedef、using等用法 2.左值、右值功能介绍
1.C左值、右值概念 C中的左值lvalue和右值rvalue是表达式的属性用于表示它们在赋值操作中的行为和特性。 左值lvalue表示一个可以标识内存位置的表达式它可以出现在赋值语句的左边或右边。左值可以被引用可以取得其地址并且在程序的生命周期中保持稳定。简而言之左值可以出现在等号左边或右边并且在其他表达式中可以被引用。 右值rvalue表示一个临时的、无法标识内存位置的表达式它只能出现在赋值语句的右边。右值不能被引用并且在表达式执行完成后可能会被销毁。右值通常是临时生成的中间结果或字面常量。
2.代码实例
左值示例
int a 5; // a是一个左值可以在赋值语句的左边或右边使用int b a; // a作为右值它的值被赋给bint c a b; // a和b都是左值可以在表达式中进行运算int* ptr a; // a的地址可以被引用右值示例
int result 2 3; // 2 3是一个右值表示一个临时的表达式结果int temp 2 3; // 2 3作为右值引用存储在一个右值引用变量中int getValue(); // 函数返回一个右值int value getValue(); // 函数返回的值是一个右值3.std::move、std::forward功能介绍
1.std::move、std::forward概念
std::forward和std::move是C标准库中提供的两个函数模板用于实现移动语义和完美转发perfect forwarding。它们在C11引入的右值引用语法的基础上提供了更灵活和高效的资源管理和函数参数传递方式。 std::move函数 std::move用于将一个左值lvalue转换为右值引用rvalue reference从而能够实现移动语义。它是通过使用静态转换static_cast来实现的并且没有运行时开销。std::move的主要作用是为了在移动语义的情况下将资源的所有权从一个对象转移到另一个对象避免了不必要的复制操作提高了性能。 2.std::forward函数 std::forward用于实现完美转发将函数参数以原有的左值或右值引用方式传递保持类型不变。它用于解决函数模板中传递参数的类型保持一致性的问题能够将右值引用转发为右值引用将左值引用转发为左值引用。std::forward通过使用模板推导和引用折叠规则来实现。
2.代码实例
v1.0 std::move实例
#include iostream
#include vector
#include stringusing namespace std;int main(){//v1.0 std::move()用法.string buf1 123;//string Rval1 buf1;//failed:将左值赋值给右值引用.string Rval3 std::move(buf1);//std::move(): 将左值转为右值,赋值给右引用.cout buf1 endl; return 0;
}
v2.0 std::move实例
#include iostream
using namespace std;void test(int x) {printf(xxx------line %d, 左值 %d\n,__LINE__,x);
}void test(int x) {printf(xxx------line %d, 右值 %d\n,__LINE__,x);
}templatetypename T
void foo(T arg) {test(std::forwardT(arg));
}void test_1(int x){printf(xxx------line %d, 右值 %d\n,__LINE__,x);
}void test_2(int x){printf(xxx------line %d, 右值 %d\n,__LINE__,x);
}int main() {//v1.0int x 42;test_2(x);//OK:因为test_2接收的是左值,因为x为左值.//test_2(42);//报错接收右值,因为test_2()只接收左值.//v2.0不是设置参数的类型左值(int )或右值(int ),则可以接收左值或右值.int y x 1;test_1(x1);//接收右值x1test_1(y);//接收左值y//v3.0:通过forward完美左值或右值转换foo(x); //接收左值: xfooint(42); //接收右值: 42return 0;
}