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

为什么常量引用在赋值l-value和r-value时表现不同?

常量引用在赋值l-value和r-value时表现不同的原因是因为常量引用的特性和限制。

首先,常量引用是指在声明时使用const关键字修饰的引用类型。它的作用是允许我们使用一个常量引用来引用一个变量,但不允许通过该引用修改被引用的变量的值。

当常量引用赋值给l-value时,即将一个变量的值赋给一个常量引用时,常量引用会直接引用该变量,并且可以通过该引用读取该变量的值。这是因为l-value是一个具有持久性的对象,常量引用可以安全地引用它,并且不会对其进行修改。

当常量引用赋值给r-value时,即将一个临时的、无法取地址的值(如表达式的结果)赋给一个常量引用时,常量引用会创建一个临时的、匿名的对象,并将该对象的值赋给常量引用。这是因为r-value是一个临时的、短暂的值,常量引用可以通过创建临时对象来引用它,并且不会对其进行修改。

常量引用的这种行为可以确保常量引用在赋值过程中不会修改被引用的变量的值,从而保证了常量引用的只读性。

在云计算领域中,常量引用的概念并不直接涉及到具体的云计算技术或产品。然而,在开发过程中,常量引用可以作为一种良好的编程实践,用于提高代码的可读性和安全性。在使用常量引用时,可以考虑使用腾讯云提供的云开发平台和工具,如腾讯云Serverless Framework(https://cloud.tencent.com/product/sls)来进行开发和部署。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C语言深度解剖 (二)

所属 变量(只读) 常量 void main() { const int a=1; int const b=2; //前面两种方式相同 const int c; //如果在定义不赋初值,后面将没有机会...specifies const object //p4=&x; //error C2166: l-value specifies const object } 看起来有点混乱,不过这里有一个记忆理解的方法...specifies const object //j=3; //error C2166: l-value specifies const object } volatile const 同时修饰...结果是不一样的 main() { union { int i; char a[2]; }*p,u; //一个 union 会占用四个字节,并且会被初始化,这是在局部区域,至于初始化为什么值...00000000 为 0x5 ptr2 指向的是 [0][1],与之后的四个字节,也就是 00000000 00000000 00000000 00000010 为 0x2000000 ---- enum 如果不赋值则会从被赋初值的那个常量开始依次加

61130

【编程经验】C语言中左值右值的区别

在C语言学习过程中,大家或许听到过左值右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!...简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。...但更多时候,我们是为了学习理解不同情况下左值右值的区别,下面来举例依次说明,着层深入,来让大家解渴! 开始了!...常量做左值右值的区别 继续 x = 2; 这里2做右值, 2是一个常量,没有任何疑问。 而如果 1 = 2; 这里我们看左值,是1是常量,这里就会有问题了,编译会报错!...因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。 ?

1.4K60
  • 《C++Primer》第四章 表达式

    左值右值 这两个名词原本是从C继承过来的,主要是为了帮助记忆,左值可以位于赋值表达式左侧,而右值不行。 C++的表达式要不然就是右值r-value,要不然就是左值l-value。...这种情况在f1f2同时修改了同个对象的值可能引发非预期的错误。 有四种运算符明确规定了运算对象的求值顺序: 逻辑与运算符&&:先求左侧 逻辑或运算符||:先求左侧 条件运算符?...当然在别的系统程序的行为可能不同甚至崩溃。...例如const int ci = i;是一个初始化语句而非赋值语句,因为该左值是常量不可修改。...例如unsigned intint运算,int类型转换为unsigned int。但是需要注意如果int类型为负,则可能带来一定的副作用(因为无符号类型无法显示负值)。

    85910

    【编程经验】C语言中左值右值的区别

    黄老师原创精品文章哦~ 在C语言学习过程中,大家或许听到过左值右值的概念,甚至在调试程序时编译器也会给出” left operand must be l-value ” 即左操作数必须为左值!...简单而言,在赋值运算符“=”左边的就是左值,在赋值运算符“=”后边的就是右值,感觉像是废话,但非常好理解。...但更多时候,我们是为了学习理解不同情况下左值右值的区别,下面来举例依次说明,着层深入,来让大家解渴!...2.常量做左值右值的区别: 继续 x = 2; 这里2做右值, 2是一个常量,没有任何疑问。 而如果 1 = 2; 这里我们看左值,是1是常量,这里就会有问题了,编译会报错!...因为常量不可被修改、不可以被赋值!所以大家可能会听过或见过”可修改/不可修改的左值”。 ?

    2.2K60

    API设计原则 – QT官网的设计实践总结

    对于什么是符合直觉的什么不符合,不同经验背景的人会有不同的看法。API符合直觉的测试方法:经验不很丰富的用户不用阅读API文档就能搞懂API,而且程序员不用了解API就能看明白使用API的代码。...4.1.2 按常量引用传参 vs. 按值传参 如果类型大于16字节,按常量引用传参。...也是为什么JavaGo语言使用interface关键字的原因,C++在多态的语义上非常容易滥用) 4.2.2 虚函数 vs....如果要使一个类能够拷贝、赋值或按值比较,往往需要拷贝构造函数、赋值操作符(operator =)相等操作符(operator ==)。...6.3 枚举类型及其值的命名 声明枚举类型,需要记住在C++中枚举值在使用时不会带上类型(与Java、C#不同)。

    2.7K20

    C++的移动语义

    在传统的拷贝语义中,当一个对象被赋值给另一个对象或作为参数传递给函数,会发生资源的拷贝操作。这包括复制堆分配的内存、拷贝文件句柄等。...这种拷贝操作可能会非常昂贵,特别是当资源非常庞大或者拷贝发生频繁。 移动语义通过使用移动构造函数移动赋值运算符来解决这个问题。...移动赋值运算符也是类似的操作。通过这种方式,对象之间的资源传递变得非常高效,而不需要进行资源的拷贝操作。 移动语义的关键在于右值引用(R-value reference)。...右值引用是C++11入的新特性,由两个连续的“&”符号(&&)表示。它用于表示临时对象或者将要销毁的对象。通过将资源的所有权转移到右值引用上,可以实现移动语义。...最后,在程序结束,资源会被释放,调用Resource的析构函数。

    47730

    C++基础知识(入门章2)

    0; } 使用 • ⽤在实践中主要是于⽤传参⽤做返回值中减少拷⻉提⾼效率改变⽤对象同时改变被⽤对象。...在类型转换中会产⽣临时对象存储中间值,也就是,rbrd⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常⽤才可以。...⼤ //int& ra = a; // 这样才可以 const int& ra = a; // 编译报错:error C3892: “ra”: 不能给常量赋值 //ra++; // 这...⾥的⽤是对b访问权限的缩⼩ int b = 20; const int& rb = b; // 编译报错:error C3892: “rb”: 不能给常量赋值 //rb++; return...• sizeof中含义不同⽤结果为⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte) • 指针很容易出现空指针野指针的问题,⽤很少出现,⽤使⽤起来相对更安全

    8810

    c++入门基础(下篇)————引用、inline、nullptr

    << &b << endl; cout << &c << endl; cout << &d << endl; return 0; } a  b  c  d本质上其实就是0  引用的特性 • 引用在定义必须初始化...• 一个变量可以有多个引用 • 引用一旦引用一个实体,再不能引用其他实体 引用的使用 • 引用在实践中主要是于引用传参引用做返回值中减少拷⻉、提⾼效率改变引用对象同时改变被引用对象。...⼤ //int& ra = a;这样才可以 const int& ra = a; // 编译报错:error C3892: “ra”: 不能给常量赋值 比如:ra++; // 这⾥的⽤是对...b访问权限的缩⼩ int b = 20; const int& rb = b; // 编译报错:error C3892: “rb”: 不能给常量赋值 比如:rb++; return 0; }...• sizeof中含义不同⽤结果为⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte) • 指针很容易出现空指针野指针的问题,⽤很少出现,⽤使

    5710

    开启C++之旅(下):引用、内联函数及现代特性(auto范围for循环)

    上次介绍了:开启C++之旅(上):探索命名空间与函数特性(缺省参数函数重载) 今天就接着进行c++入门的知识讲解 1.引用 1.1用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间...,并且这些临时变量通常具有常量性质,那就需要用常引用 加了const就好了 在 C++ 中进行类型转换,通常会创建一个临时变量来存储转换后的结果。...这也是为什么对a进行类型转换后赋值,但是a不发生变化 1.4用使用场景 1.4.1做参数 在函数中使用引用作为参数,可以让你直接操作传递给函数的变量,而不是对其进行复制。...引用在定义必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型的大小...用auto声明指针类型,用autoauto*没有任何区别,但用auto声明引用类型则必须加& 在同一行定义多个变量 当在同一行声明多个变量,这些变量必须是相同的类型,否则编译器将会报错

    22810

    C++入门

    在定义必须初始化 • ⼀个变量可以有多个⽤ • ⽤⼀旦⽤⼀个实体,再不能⽤其他实体 • ⽤在实践中主要是于⽤传参⽤做返回值中减少拷⻉提⾼效率改变⽤对象同时改变被⽤对象。...= a; // 编译报错:error C3892: “ra”: 不能给常量赋值 //ra++; // 这⾥的⽤是对b访问权限的缩⼩ int b = 20; const int& rb = b; //...编译报错:error C3892: “rb”: 不能给常量赋值 //rb++; return 0; } #include using namespace std; int main...• sizeof中含义不同⽤结果为⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte) • 指针很容易出现空指针野指针的问题,⽤很少出现,⽤使...// 为什么要加外⾯的括号? // 为什么要加⾥⾯的括号?

    9310

    移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)

    函数重载 C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。...的使⽤ • ⽤在实践中主要是于⽤传参⽤做返回值中减少拷⻉提⾼效率改变⽤对象同时改变被 ⽤对象。 ...访问权限的放⼤(a的值不可变,但ra可以变) // 这样才可以 const int& ra = a; //(ra也不可变) //ra++; // 编译报错:error C3892: “ra”: 不能给常量赋值...: “rb”: 不能给常量赋值 2.3 传值返回传引用返回  1. ...⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对 象存储中间值,也就是,rbrd⽤的都是临时对象,⽽C++规定临时对象具有常性(可理解为const类型),所以这⾥ 就触发了权限放

    7810

    Const的应用与备忘

    前言 const直译“常量”。在软件的开发中,我们会经常需要定义一些不能修改的变量。但在cpp中,由于变量的结构比较复杂,对不能修改这个概念,在不同的变量类型中,const的实际意义是不同的。...那为什么const int a=9;不会产生错误呢。原因就是const int a=9;的默认作用范围是文件作用域的。...; return 0; } // output: 0012ff7c 0012ff7c 0 1 ij地址相同,指向同一块空间,i虽然是可折叠常量,但是,i确实有自己的空间。...ij指向同一块内存,但是*j = 1对内存进行修改后,按道理来说,*j==1,i也应该等于1,而实验结果确实i实实在在的等于0,这是为什么呢,就是本文所说的内容,i是可折叠常量,在编译阶段对i的引用已经别替换为...只有返回指针才有意义 成员变量 class A { public: A(int size) : SIZE(size) {}; private: const int SIZE; };

    36220

    【C++修行之道】(引用、函数提高)

    ,也说明为什么引用不可更改 int& ref = a; ref = 20; //内部发现ref是引用,自动帮我们转换为: *ref = 20; cout << "a:" << a << endl...,防止形参改变实参 示例: int main() { //常量引用 //使用场景:用来修饰形参,防止误操作 int a = 10; const int& ref = 10;// 引用必须一块的内存空间...int a = 10; showValue(a); system("pause"); return 0; } 1.7指针的区别 对比了引用指针在C++中的基本性质、初始化要求、空值...可以不初始化,初始化后可更改指向 空值 不能指向空值 可以指向nullptr或NULL 操作灵活性 类似普通变量,无算术操作 可进行算术操作,改变指向地址 可复制性 不可复制,不能重新赋值 可复制,可赋值...//3.函数参数类型不同,或者个数不同,或者顺序不同 void func() { cout << "func 的调用!"

    12610

    C++入门基础

    //int& ra; int& b = a; int c = 20; // 这⾥并⾮让b⽤c,因为C++⽤不能改变指向, // 这⾥是⼀个赋值 b = c; cout << &a <...< endl; cout << &b << endl; cout << &c << endl; return 0; } 6.3用的使用 • 引用在实践中主要是于引用传参引用做返回值中减少拷贝提高效率改变引用对象同时改变被引用对象...⼤ //int& ra = a; // 这样才可以 const int& ra = a; // 编译报错:error C3892: “ra”: 不能给常量赋值 //ra++; // 这⾥的...⽤是对b访问权限的缩⼩ int b = 20; const int& rb = b; // 编译报错:error C3892: “rb”: 不能给常量赋值 //rb++; return 0;...• 引用在定义必须初始化,指针建议初始化,但是语法上不是必须的。 • 引用在初始化时一个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。

    9910

    Scala语法介绍

    2.常量     val:用来声明一个常量,一旦被赋值就不能再进行修改。     ...注:java中变量使用较多,但在scala里,常量使用较多,因为在线程并发可以减少甚至杜绝多线程并发安全问题,所以scala特别适合于应用在处理高并发场景。...这种情况下可以加上lazy关键字,延后变量/常量赋值的位置。这样直到后续真正用到这个量才真正开辟空间赋值,减少了内存的浪费。...以上基本数据类型的直接量java中基本完全相同,不再复述。     这九个类的直接量在需要可以自动被转换为其对应的富包装类来调用,富包装类提供的额外方法。     ...每种数据类型都提供了很多方法供调用,所以scala的数据类型不同于java的基本类型。

    1.2K50

    C++中四种类型转换以及const_cast是否能改变常量的问题

    去除const限定,通常是为了函数能够接受这个实际参数 static_cast(expr) 编译器隐式执行的任何类型转换都可以由static_cast完成 当一个较大的算术类型赋值给较小的类型...二、也许大家都有过这样的疑惑:const_cast可以去除一个常量的const属性,去除const属性后应该可以对“常量”进行修改,通过调试器发现内存中的值是被改变的,可是再传递这个“常量”的时候,值却一直保持原状...,实在古怪,在Windows下用VC、尝试如此,在Linux下用g++尝试也如此,我原先以为编译器的优化选项有关系,把所有优化选项关闭,照样没用,为什么?...,然后通过指针引用对其进行了修改,所以通过指针打印或者引用传参的时候就能看出其内存确实变化了,但为了保护val这个变量本来的const特性,所以每次我们使用val,系统都将其替换成初始值100,确保了...The type of expression must be a pointer if type-id is a pointer, or an l-value if type-id is a reference

    1.4K100

    【C++】初识C++(下)

    cout << &d << endl; return 0 ; } 此刻a,b,c,d全部指向同一个空间,d++就代表a,b,c,d全部++ 引用的特性 • 引用在定义必须初始化...,方便了很多,当然应用的存在不仅仅方便了这一点 • ⽤在实践中主要是于⽤传参⽤做返回值中减少拷⻉提⾼效率改变⽤对象同时改变被 ⽤对象。...//int& ra = a; // 这样才可以 const int & ra = a; // 编译报错: error C3892: “ra”: 不能给常量赋值...编译报错: error C3892: “rb”: 不能给常量赋值 //rb++; return 0 ; } # include <iostream...• sizeof中含义不同⽤结果为⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下占4个字节,64位下是8byte) • 指针很容易出现空指针野指针的问题,⽤很少出现,

    6210

    由C语言过渡到C++的敲门砖

    (无法直接代替指针) 使用格式: 类型& 引用别名 = 引用对象; 引用的特性 • ⽤在定义必须初始化 • ⼀个变量可以有多个⽤ • ⽤⼀旦⽤⼀个实体,再不能⽤其他实体 在定义初始化...) 原因 当该返回值为int,返回的临时变量STTop(st1)为常量常量无法修改。...常量的延伸 (表达式1 + 表达式2)在赋值也会产生临时对象 注意:临时对象具有常性!...指针引用的关系 • 语法概念上⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。 • ⽤在初始化时⽤⼀个对象后,就不能再⽤其他对象;⽽指针可以在不断地改变指向对象。...• sizeof中含义不同⽤结果为⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下 占4个字节,64位下是8byte) • 指针很容易出现空指针野指针的问题,⽤很少出现,⽤使

    9110

    【C++篇】启航——初识C++(下篇)

    3.必须初始化:引用在创建必须初始化,并且一旦初始化后不可改变绑定的对象。 4.不能为 NULL:引用不能被赋值为 nullptr,必须引用一个有效的对象。...3.3 必须初始化 引用在创建必须被初始化。它不能在声明后再被赋值或指向其他变量。这一特性使得引用在使用时更加安全,避免了指向无效对象的风险。...3.4 不能为 NULL 引用不能被赋值为 nullptr,它必须引用一个有效的对象。这意味着引用在创建后始终是有效的,避免了指向空地址的风险。...指针在定义不一定要初始化,可以在之后赋值。 (2).初始化 引用:在定义引用时,必须立即初始化并引用一个有效的对象。一旦绑定到某个变量后,就无法改变引用的对象。...int a = 10; int &b = a; // 必须初始化 指针:指针在定义不需要初始化,可以稍后赋值。指针可以随时指向不同的对象。

    5610
    领券