首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++ 左值和右值

左值和右值 在C++11之前,一个变量分为左值和右值:左值是可以放在=运算符左边的值,有名字,可以用&运算符取地址(如 int n = 10;n即为左值);右值则是只能放在=运算符右边,没有名字,不能用...在c++11以后,右值在函数参数匹配时会优先与右值引用绑定,而不是const左值引用。 注意: 左值引用和右值引用本身都为左值,都可以取地址。...//在《Effective Modern C++》中建议:对于右值引用使用std::move,对于万能引用使用std::forward。...左值引用和右值引用的作用都是减少拷贝,右值引用可以认为是弥补了左值引用的不足之处。 目前右值引用主要是用来实现移动语义std::move()和完美转发std::forward()。...右值引用做参数和做返回值时可减少拷贝次数,本质上利用了移动构造和移动赋值。 右值引用和const左值引用可以延长其绑定临时对象的生命周期。

1.2K181
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    提高代码逼格的利器:宏定义-从入门到放弃

    宏的本质就是代码生成器,在预处理器的支持下实现代码的动态生成,具体的操作通过条件编译和宏扩展来实现。我们先在心中建立这么一个基本的概念,然后通过实际的描述和代码来深入的体会:如何驾驭宏定义。...通过函数来实现: 形参的类型需要确定,调用时对参数进行检查; 调用函数时需要额外的开销:操作函数栈中的形参、返回值等; 通过宏来实现: 不需要检查参数,更灵活的传参; 直接对宏进行代码扩展,执行时不需要函数调用...所以,从代码的动态生成角度看,宏定义和 C++ 中的模板参数有点神似,只不过宏定义仅仅是代码扩展而已。...看一下宏扩展之后的代码(__VA_ARGS__为空): printf("hello \n",); 看出问题了吧?在格式化字符串的后面多了一个逗号!...printf(format, ##args) 六、奇思妙想的宏 宏扩展的本质就是文本替换,但是一旦加上可变参数(__VA_ARGS__)和 ## 的连接功能,就能够变化出无穷的想象力。

    1.2K40

    C++中的左值和右值

    在C/C++中,左值(lvalue)和右值(rvalue)是用于规定表达式(expression)的性质。C++中表达式要不然是左值,要不然是右值。...但是当来到C++时,二者的理解就比较复杂了(PS:有对象真是麻烦) 简单的归纳: 当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份即在内存中的地址。...eg: num1 = num2 =num3; 在这里,等于运算符从右到左计算,所以num2和num1是左值,num2=num3得到的结果也是左值,但是在这个语句里被当成右值使用了...内置解引用运算符、下标运算符、迭代器解引用运算符、string和vector的下标运算符的求值结果,都是左值。 内置类型和迭代器的递增递减运算符作用于左值运算对象所得的结果也是左值。...特例两个 当函数的返回值是引用类型是,可以用作左值,当函数的返回值是其他类型时,不能用作左值。

    1.8K30

    C++中的左值和右值

    C++中的左值和右值 学C++时间也不短了,突然发现,还不知道左值和右值是什么,毕竟学C++不够系统,详细。...当然,以常量对象为代表的某些左值实际上不能作为赋值语句的左侧运算对象(本人理解:功能不全的左值;除了自己的初始化,一般不用作左值使用。) 个人理解:左值一般和地址有关系。...左值和右值转换的一个重要原则:在需要右值的地方可以使用左值来替代,但是不能在需要左值(位置)的地方,使用右值。当然,也有一种例外的情况(参见P470,还没看到)。...P149:左值是指那些求值结果为对象或函数的表达式。一个表示对象的非常量左值可以作为赋值 关于运算符操作数和返回值的左右值 ?...对于 1),这和 c 是一致的,2) 却是 C++ 中所独有, 因此,如果你看到 C++ 中如下的写法,千万不要惊讶: class cs { public: cs(int i):

    2.4K30

    C++ 中的左值和右值

    一、前言 一直以来,我都对C++中左值(lvalue)和右值(lvalue)的概念模糊不清。我认为是时候好好理解他们了,因为这些概念随着C++语言的进化变得越来越重要。...二、左值和右值——一个友好的定义 首先,让我们避开那些正式的定义。在C++中,一个左值是指向一个指定内存的东西。另一方面,右值就是不指向任何地方的东西。...通常来说,右值是暂时和短命的,而左值则活的很久,因为他们以变量的形式(variable)存在。我们可以将左值看作为容器(container)而将右值看做容器中的事物。...答案很简单:x和y经历了一个隐式(implicit)的左值到右值(lvalue-to-rvalue)的转换。许多其他的操作符也有同样的转换——减法、加法、除法等等。 五、左值引用 相反呢?...一个右值可以被转化为左值吗?不可以,它不是技术所限,而是C++编程语言就是那样设计的。

    1.8K20

    整理CC++的可变参数

    直到C99编译器标准,它允许可以定义可变参数宏(variadic macros) C宏可变参数 可变参数宏: #define DEBUG(...) printf(__VA_ARGS__) /* 在1999...年版本的ISO C 标准中 */ #define LOG(format, ...) fprintf (stderr, format, __VA_ARGS__) ...代表一个变化的参数表 __VA_ARGS...并且可以发现printf的实现为什么一定需要%s,%d等这种格式化字符串是为了给va_*宏两点关键信息:1.可变参数的个数(百分号的个数);2.可变参数的类型(%s,%d等) 不过C++作为扩展C,当然克服了这些限制...于是C++提供了可变参数模板 C++可变参数 C++的可变参数模板是怎么做到不需要告诉参数个数的呢?...+的可变参数模板 C/C++可变参数,“## VA_ARGS”宏的介绍和使用

    5.6K00

    CC++ 之 C发展史及 各标准特性说明

    例如:宏支持取参数 #define Macro(…) __VA_ARGS__使用宏的时候,参数如果不写,宏里用#,## 这样的东西会扩展成空串。...函数的联机扩展会产生较长的代码,所以只应该内联对应用程序性能有显著影响的函数以及长度较短的函数  新增数据类型  _Bool    值是0或1。...宏,并将它们扩展为_Complex和_Imaginary,因此在编写新的应用程序时,应该使用头文件中的complex和imaginary宏. ...__VA_ARGS__)  // 宏参数里面“...”的部份会展开到__VA_ARGS__处。   ...C99中,非空类型函数必须使用带返回值的return语句扩展的整数类型  扩展类型含义int16_t整数长度为精确16位int_least16_t整数长度为至少16位int_fast32_t最稳固的整数类型

    95000

    Google Mock(Gmock)简单使用和源码分析——源码分析

    这和FunctionMocker定义方式是一样的。         GTEST_COMPILE_ASSERT_宏用于检测定义的参数个数是否符合规定。...::FunctionVA_ARGS__>::Argument##N         Function模板类在之前我们反复见过,它的一个非常大的作用就是从函数类型中拆分出函数返回值类型和各个参数类型...EXPECT_CALL、ON_CALL宏                 在介绍MOCK_METHOD系列宏是,我们发现其在我们mock的类中定义两个方法和一个变量: GMOCK_RESULT_(tn,...2中的函数是使用gmock和函数名联合组装成的新函数名,它返回了一个被参数筛选的函数对象。EXPECT_CALL和ON_CALL宏中就是调用了它。...还定义了一个和需要mock的函数同名的函数,该函数内部完成最终的结果计算。 EXPECT_CALL宏和WillOnce、WillRepeatedly等方法,设定了函数对象的一些特性。

    4.6K20

    C++使用ffpython嵌入和扩展python

    使用python和C++结合的技术拥有如下优势: l  主体系统使用C++实现,保持系统的高效。...当c++与python进行交互时,C++层希望操作python数据结构就像操作c++ STL一样方便,而在python脚本层,又希望c++传入的参数或返回值都是原生的python数据 l  C++中常用的指针传递对象...调用call接口必须指定接收的返回值类型,可以使用void忽略返回值,除了可以使用标准类型,stl接口也可以被使用,python中的tuple和list可以转换成vector和list,dict则可以被转换成...同样返回值的类型也是如此。...以及已经被注册的c++类的指针类型。返回值的类型约束同样如此。c++ STL中的vector和list对应于python的tuple和list,map类型则对应于dict。

    1.3K40

    【译】理解C和C++中的左值和右值

    和“右值”在C和C++编程中并不经常使用,但一旦使用到左值和右值,它们的含义好像并非那么清楚。...但编译器里的error字段信息的确提到了lvalue,即左值。这个术语通常不会在C和C++教程里提到。...正如你们所想,右值引用和移动语义是及其复杂的一个分支,需要考虑一些特殊的场景和目标。笔者在这里只是简单的展示了在C++中左值和右值的区别。...结论 也许我们可以在不关心左值和右值的情况下写出很多C++代码,至多把它们当做是编译器里error信息中一些奇怪的术语。...然而,本文的目的是想帮助各位对C++代码有更深入的理解,并且能更加容易理解程序语言专家们制定的规范。 另一方面,C++11中介绍了右值引用和移动语义,新的C++规范中关于左值右值的论述越来越重要。

    1.2K10

    同步&异步日志系统:前置知识

    /vim • g++/gdb • Makefile 核心技术(会用到哪些前置知识): • 类层次设计(继承和多态的应⽤) • C++11(多线程、auto、智能指针、右值引⽤等) • 双缓冲区 • ⽣产消费模型...2.1 不定参宏函数          我们起初的风格可以这样写,但是这样写的话,我们每次写一些固定的变量的时候都需重复书写(比如 __FILE__和__LINE__) #include宏参数列表中最后的参数写成省略号(...),使其可以接受数量可变的宏参数。...2、后边用不定参数宏__VA_ARGS__可以自动扩展  按理来说一定要带参数否则__VA_ARGS__无法扩展,最后替换时会留一个‘,’导致错误,但是我们可以用##来避免这个问题 3、## __VA_ARGS..., "hello",666); LOG("%s-%d", "hello", 666); return 0; } 运行结果: 使用了宏定义来实现日志功能,虽然这种方式可以达到目的,但宏定义在C++中不够类型安全

    10300

    Swift 2023:所有权、宏和 C++ 互操作

    Simone 译者 | 平川明知山 策划 | 丁晓昀 Swift 语言工作组已经详细说明了 2023 年及以后 Swift 重点发展的主要领域,其中包括定义内存管理的所有权模型、不可复制类型、宏系统和...C++ 互操作。...Swift 另一个有前途的领域是创建一个过程宏系统,以创建高级库和 DSL。宏是一种代码生成机制,可以在词法、句法或语义层面对源代码进行转换。...Swift 中现有的一些功能可以实现为宏,如 Codable 协议、字符串插值、属性封装器和结果构建器。...根据 Swift 语言团队的说法,当前的 C++ 互操作实现已经支持自有值类型、普通值类型、外部引用类型和迭代器,并为方法、指针、l- 值和 r- 值引用有关的基本问题提供了答案。

    1.4K10

    深入理解C++11(一)

    .通过内联命名空间、继承构造函数和右值引用等,以更好地支持库的构建。...C编译器用这个宏的值表示编译器的实现是否和C标准一致。...C++11中这个宏是否定义以及定成什么值由编译器决定 STDC_VERSION C编译器通常用这个宏来表示所支持的C标准的版本。...C++11中这个宏是否定义以及定成什么值由编译器决定 STDC_ISO_10646 这个宏定义为一个yyyymml格式的整数常量,例如199712L,用来表示C++编译环境符合某个版本的ISO/IEC...2.4 变长参数的宏定义以及__VA_ARGS__ 在C99标准中,程序员可以使用变长参数的宏定义,指在宏定义中参数列表的最后一个参数为省略号,__VA_ARGS__可以在宏定义的实现部分替换省略号所代表的字符串

    1.2K90

    Linux kernel中常见的宏整理

    0x0 宏的基本知识 // object-like#define 宏名 替换列表 换行符//function-like#define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识符列表都是将字符串...int __builtin_choose_expr(exp, e1, e2); max宏 同min 宏 roundup宏 返回一个能够整除y并且大于x,最接近x的值,向上取整,可用于地址的内存对齐 #define...*/#define clamp(val, lo, hi) min((typeof(val))max(val, lo), hi) abs宏 取绝对值 /** * abs - return absolute...force t) a /*转成成原来的类型*/ # define __force __attribute__((force))表示所定义的变量类型可以做强制类型转换 time_after32(a, b)宏和...#ifdef ASSEMBLY宏 一些常量宏同时在汇编和C中使用,然而,我们不能像注释C的常量宏那样加一个“UL”或其他后缀。所以我们需要使用以下的宏解决这个问题。

    2K50

    从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、newdelete 等

    参数宏定义的意义就很清楚了,查看下输出即可。 我们知道printf函数带有可变参数,函数式宏定义也可以带可变参数,同样是在参数列表中用...表示可变参数。...例如: #define showlist(...) printf(#__VA_ARGS__) #define report(test, ...) ((test)?...printf("x>y") : printf("x is %d but y is %d", x, y)); 在宏定义中,可变参数的部分用__VA_ARGS__表示,实参中对应...的几个参数可以看成一个参数替换到宏定义中...__VA_ARGS__所在的地方。...extern “C” 可以实现C与C++混合编程,被extern "C" 修饰的变量和函数是按照C语言方式进行编译和链接的,即对C语言写的函数不进行改名,一般在 C的头文件中使用,如果头文件被C代码包含并用

    1.2K00

    【为宏正名】99%人都不知道的##里用法

    【说在前面的话】 ---- 有人说C语言中最臭名昭著的两兄弟就是指针和宏了。...这个系列将本着实用的原则介绍一些宏在模块封装中“点石成金”的用法,让大家正确认识到宏真实的作用和使用规则——真真正正还“宏”一个公道。...【"##"的官方“里”用法】 ---- “##”还有一个很少为人所知的“里”用法,在介绍它之前,不得不首先说说由ANSI-C99标准引入的另外一个参数宏扩展——可变参数宏。...) ( 默认值 ,##__VA_ARGS__) 它有两种使用情况情况: 当我们使用参数宏的时候在括号里不填写任何内容,最终会展开为仅有默认值的情况: EXAMPLE(); 被展开为: ( 默认值...此时,我们可以通过宏来提供默认值NULL: #define XXXX_INIT(...)

    4.1K20

    C++中decltype与左值和右值「建议收藏」

    编译器根据分析表达式或者函数返回值来分析其类型。...decltype的详细用法,请参考《C++中decltype的使用方法》 2 decltype与左值和右值 decltype后面跟的表达式是左值或者右值时,编译器分析的类型会有所不同。...如果表达式(非单个变量)的求值结果是左值,则编译器会得到一个引用类型;如果表达式(非单个变量)的求值结果是右值,则编译器会得到一个与表达式相同的类型。...10,20 }; decltype (arr[1])k = i; decltype (&arr[1])j = &i; 其中,arr是一个拥有2个元素的int数组,arr[1]的类型是int,该表达式是一个左值,...因此k的类型是一个引用类型,即int&;&arr[1]的类型是int*,该表达式是一个右值,因此j的类型是int*。

    58410
    领券