c++ 函数:将非 const 参数传递给 const 引用参数

Posted

技术标签:

【中文标题】c++ 函数:将非 const 参数传递给 const 引用参数【英文标题】:c++ function: pass non const argument to const reference parameter 【发布时间】:2012-02-25 23:36:05 【问题描述】:

假设我有一个接受 const 引用参数传递的函数,

int func(const int &i)

  /*    */


int main()

  int j = 1;
  func(j); // pass non const argument to const reference
  j=2; // reassign j

这段代码运行良好。根据 C++ 入门,传递给该函数的参数如下所示,

int j=1;
const int &i = j;

其中i是j的同义词(别名),

我的问题是:如果 i 是 j 的同义词,并且 i 被定义为 const,代码是:

const int &i = j

redelcare 一个非 const 变量到 const 变量?为什么这个表达式在 c++ 中是合法的?

【问题讨论】:

【参考方案1】:

引用是常量,而不是对象。它不会改变对象是可变的这一事实,但是您可以通过该对象的一个​​名称 (j) 来修改它,而您不能通过另一个名称 (i) 来修改它。

在 const 引用参数的情况下,这意味着 main 可以修改对象(因为它使用它的名称,j),而 func 不能修改对象,只要它只使用它的名字,ifunc可以原则上通过使用const_cast 创建另一个引用或指向它的指针来修改对象,但不要这样做。

【讨论】:

你的意思是引用不是对象本身。那么如何理解 i 是 j 的同义词呢?这是否意味着 i 和 j 是同一个对象,因为 i 和 j 具有相同的物理地址? i 是对对象 j 的替代引用。所以是同义词。但是,您已经说过您不能使用“i”来更改它所指的对象。没有什么说您不能使用其他方法来修改 i 所指的对象。您使用该声明限制 i 的功能,而不是尝试扩展它们,这很好。 @xiaopang: 'i' 和 'j' 是名称。它们都指向同一个对象。我们经常说某物“是”它的名字,或者说名字“是”对象。例如,我可能会说“我是史蒂夫”。但这是不精确的术语,两者不是一回事。我也可以说,“'Steve' 以大写的 'S' 开头”。这并不意味着 I 以大写的“S”开头。 'Steve' 周围的引号表明我在谈论名称,而不是它所指的对象。 ij 是同义词,因为它们都是同一个对象的名称,但它们作为名称的属性不同。【参考方案2】:
const int &i = j;

这声明了对常量整数的引用。 使用此引用,您将无法更改它引用的整数的值。

您仍然可以使用原始变量名 j 更改值,只是不使用常量引用 i。

【讨论】:

以上是关于c++ 函数:将非 const 参数传递给 const 引用参数的主要内容,如果未能解决你的问题,请参考以下文章

Python 仅将非 None 的参数传递给函数

将非静态成员函数作为参数传递给另一个类中的成员函数

如何将非硬编码参数传递给 Python 装饰器?

小白学习C++ 教程八在C++指针传递引用和Const关键字

markdown 将非原始参数传递给Apex方法的问题

如何将参数传递给英特尔 SSE 内在函数中的 const 值?