临时对象(临时变量)
临时变量在代码中不体现,并且也没有名字的变量
临时对象的产生条件(2):
- 函数调用时所发生的隐式类型转换
- 调用函数产生的返回值
核心:临时对象天生规定是const
类型,因此在进行对临时变量进行传参或者修改值是会发生一些错误,比如:
string foo();
bar(string &a);
bar(foo());//非法操作,像这种就是明显的不熟悉临时对象的特点
让我们来详细理解一下上述代码
- 函数返回临时对象:
foo() 是一个返回 string 对象的函数。当调用 foo() 时,它会返回一个临时的 string
对象。在C++中,临时对象是 const
类型的,这意味着它们不能被修改。
- 函数参数类型:
bar(string& s) 这个函数的参数是一个非 const
的 string
引用。这意味着 bar 函数期望接收一个可以修改的 string 对象的引用。
- 问题所在:
当你调用 bar(foo()) 时,foo() 返回的是一个临时的 string 对象。由于临时对象是 const 的,你不能将一个 const
临时对象传递给一个期望 非const
引用的函数参数。
换句话说,bar 函数期望接收一个可以修改的 string 引用,但你传递给它的是一个不可修改的临时对象,这会导致编译错误。
- 解决方法:
如果想要 bar 函数能够接受临时对象,可以将参数改为 const 引用,即 void bar(const string& s)
。这样,bar 函数就可以接受临时对象,因为它承诺不会修改传入的 string 对象。但与此同时参数不可更改
上述解释的核心点在于把一个 const
的引用绑定到给一个 非const
引用类型是不允许的
搞清const变量拷贝和const引用绑定
!但请千万注意,以上内容都是基于 const引用 来说明的,并不说明 const 类型的变量不可以赋值给 非const 类型
- const 类型赋值给非 const 类型
直接赋值(值拷贝)是允许的:
const int x = 10;
int y = x; // 正确:const 的值可以拷贝给非 const 变量
这里,x 是一个 const 变量,它的值被拷贝到非 const 变量 y。这是允许的,因为拷贝操作不会影响原始的 const 变量。
- 绑定引用是不允许的:
const int x = 10;
int& y = x; // 错误:不能将 const 绑定到非 const 引用
这里,x 是一个 const 变量,尝试将其绑定到非 const 引用 y 会导致编译错误。这是因为如果允许这样做,就可以通过 y 修改 x,从而破坏 const 的承诺。
- 为什么绑定引用不允许?
const
是一种承诺,表示“我不会修改这个值”。
如果将 const 变量绑定到非 const 引用,就相当于允许通过该引用修改 const 变量,这违反了 const 的语义。
准确的表述
允许:将 const 类型的值拷贝给非 const 变量。
不允许:将 const 类型的变量绑定到非 const 引用。
总结
值拷贝:const 的值可以赋值给非 const 变量,因为这只是复制值,不会影响原始的 const 变量。
引用绑定:const 的变量不能绑定到非 const 引用,因为这会允许通过引用修改 const 变量,违反 const 的语义。