为什么const int和bind绑定到int?

kar*_*rel 15 c++ reference c++11

在C++入门中,我发现const int &可以用int对象绑定.我不明白,因为我认为const int &应该绑定一个const int不是一个int对象,int对象可以改变,本书解释了这个问题,当const int &对象绑定时int; 两者之间有一个临时对象,例如:

int a=0;
const int &r=a;
Run Code Online (Sandbox Code Playgroud)

我们可以使用b临时值,所以上面等于:

const int b=a;
const int &r=b;
Run Code Online (Sandbox Code Playgroud)

但是我认为这本书不对,因为如果有一个临时的b存在之间,a并且r,价值r无法改变,但是当我在visual studio中调试以下编码时,我发现它不对:

int a=0;
const int &r=a;
a=3;
cout<<r<<endl;
Run Code Online (Sandbox Code Playgroud)

输出是可以改变r=3;的值r,为什么?我不明白.

eer*_*ika 16

不明白,因为我认为const int &应该绑定一个const int不是一个int对象

你误会了.引用const(简称const引用)并不意味着只能绑定const对象.这意味着无法通过引用修改对象.

不允许的是将非const引用绑定到const对象,因为这样的引用可用于修改将破坏const的对象.

价值r可以改变,为什么?

r引用的对象被修改 - 这是正常的,因为该对象不是const.r仍然引用相同的对象,并且未使用修改对象r.

具有const引用并不意味着引用的对象不能更改.这意味着无法使用该引用更改对象.

如果你希望有一个无法改变的对象,那么该对象本身必须是const.const引用不会使引用的对象成为const.这本书向您展示了如何创建一个const对象:

const int b=a;
Run Code Online (Sandbox Code Playgroud)

我错误地认为引用是poiter,因为它们在某个时候是相似的.

实际上,引用与指针非常相似.关于这个问题的背景,他们的行为类似.演示:

int a=0;
const int *r=&a;
a=3;
cout<<*r<<endl;
Run Code Online (Sandbox Code Playgroud)

  • @RM我认为这有点超出了问题的范围,但在C++中"确实"是常量对象.Constness简单地根据非可变数据成员来定义.我们决定不关心可变成员是否被修改.即使在甚至不能修改可变成员的意义上,也存在这样的对象:任何没有可变成员的const对象.例如,没有任何基本类型具有任何类型的成员. (2认同)
  • @RM对象和变量彼此紧密相关.如果变量是const,那么对象(可变成员除外)可能不会被修改,甚至不能"绕过"变量.当程序具有UB时,这种保证是否不成立是毫无意义的考虑因素.如果有UB,则无法保证任何事情. (2认同)

Log*_*man 6

const在此示例中,仅保证ar使用的位置无法更改.通常这用于不改变输入参数的函数,如:

int doNotModifyFoo(const int &foo);
Run Code Online (Sandbox Code Playgroud)