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

11

假设我有一个接受常量引用参数的函数,

int func(const int &i)
{
  /*    */
}

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

这段代码完全有效。根据C++ primer的解释,传递给这个函数的参数如下:

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

如果i是j的同义词(alias),并且i被定义为const,那么我的问题是:如果将代码写成

const int &i = j

这样是否重新将非const变量声明为const变量?为什么这个表达式在C++中是合法的?

2个回答

20

这里的引用是const,而不是对象。这并不改变对象是可变的事实,但你有一个名字 (j) 用来修改对象,另一个名字 (i) 则不能。

对于const引用参数,这意味着 main 可以修改对象(因为它使用了它的名字 j ),而 func 只要使用了它的名字 i 就不能修改对象。理论上, func 可以通过使用 const_cast 创建另一个引用或指针来修改对象,但最好不要这样做。


你的意思是说引用并不是对象本身。那么如何理解i是j的同义词?这是否意味着i和j是同一个对象,因为它们都具有相同的物理地址? - fuyi
i是对象j的另一种引用方式,也就是同义词。但是你说过不能使用“i”来修改它所引用的对象。并没有规定你不能使用其他方法来修改i所引用的对象。你在声明中限制了i的能力,而不是试图扩展它们,这是可以接受的。 - Tom Tanner
1
@xiaopang:'i'和'j'是名称。它们都指向同一个对象。通常我们说某个东西“是”它的名字,或者说名字“是”这个对象。例如,我可能会说“我是史蒂夫”。但这是不精确的术语,两者并不相同。我也可以说,“‘史蒂夫’以大写字母‘S’开头”。这并不意味着以大写字母'S'开头。引号中的“史蒂夫”表示我正在谈论名称,而不是它所指的对象。'i'和'j'是同义词,因为它们都是指向同一个对象的名称,但它们作为名称的属性是不同的。 - Steve Jessop

4
const int &i = j;

这声明了一个对常量整数的引用。 使用这个引用,你将无法改变它所引用的整数的值。

你仍然可以通过使用原始变量名j来改变值,只是不能使用常量引用i来改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接