传递常量引用与创建临时常量副本相同,那么为啥要传递常量引用呢? [复制]

Posted

技术标签:

【中文标题】传递常量引用与创建临时常量副本相同,那么为啥要传递常量引用呢? [复制]【英文标题】:Passing a constant reference is the same as creating a temporary constant copy, so why pass a constant reference? [duplicate]传递常量引用与创建临时常量副本相同,那么为什么要传递常量引用呢? [复制] 【发布时间】:2014-01-12 06:25:57 【问题描述】:

我认为通过引用传递的目的是传递实际变量以节省时间或修改变量。因此——这会让我听起来很愚蠢——我曾经认为传递一个常量引用会以某种方式暂时将传入的变量更改为一个常量(如果它还没有的话),然后将它改回一个非- 函数完成执行时的常量(除非它一开始是常量)。我今天在阅读 C++ Primer 时才了解到,传入常量引用会创建一个临时常量变量。也就是说,

foo(const type& obj) 

一样
foo(const type obj)

因为它们都创建了一个常量对象obj 并将其设置为等于传入的任何内容。

那么通过常量引用传递有什么意义???无论如何,参考的意义何在?它们与指针是一样的,只是它们需要初始化,因此用处不大。

【问题讨论】:

不确定你(或书)所说的“创建一个临时常量变量”是什么意思,但无论如何,引用是一个小对象,而实际副本与原始对象一样大。常量引用通常用于节省空间(以及制作副本的时间)。 引用所做的只是引用一个现有变量,而不是创建一个新变量(至少是那种类型的;它可能会在引擎盖下创建一个指针)。 const 引用对不修改它的承诺也有同样的作用。如果你传入一个临时的,必须创建一些东西来引用。 回答您问题的最简单方法是查看程序集。 【参考方案1】:

当您传递常量引用时,不会创建临时副本.....而如果您传递常量参数,则会创建新副本....

您可以通过打印调用函数和被调用函数中的变量地址来检查这一点。

【讨论】:

【参考方案2】:

正确的做法是使用常量引用:

foo(const type& obj)

因为这样不会复制对象,而且效率更高,尤其是在对象很大或函数被多次调用的情况下。

【讨论】:

【参考方案3】:

没有。常量变量会创建临时变量,但常量引用可能不会。

【讨论】:

如果参数需要转换为正确的类型,可以创建一个临时的。

以上是关于传递常量引用与创建临时常量副本相同,那么为啥要传递常量引用呢? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

便宜的值传递与常量引用传递

Python按值传递参数和按引用传递参数

将多个右值和左值传递给函数而不创建重载

C++ 通过常量引用传递和通过常量引用返回

传递常量是通过引用自动传递的吗?

为啥我不能将常量数组作为参数传递?