当常量ref被原始对象(非常量)替换时,常量是否消失? 我经常在C++书籍中看到下面的关于引用的语句:

当常量ref被原始对象(非常量)替换时,常量是否消失? 我经常在C++书籍中看到下面的关于引用的语句:,c++,constants,object-reference,C++,Constants,Object Reference,引用只是原始对象的另一个名称。使用时,它将被原始对象替换(在大多数情况下) 问题是: 如果我将常量ref绑定到一个非常量对象,当这个常量ref被原始对象使用和替换时,常量会消失吗 int i = 42; const int & r1 = i; int & r2 = r1; // Question: shouldn't r1 here just be replaced by the original object, which is **non-const**? 书在撒谎

引用只是原始对象的另一个名称。使用时,它将被原始对象替换(在大多数情况下)

问题是: 如果我将常量ref绑定到一个非常量对象,当这个常量ref被原始对象使用和替换时,常量会消失吗

int i = 42;  
const int & r1 = i;  
int & r2 = r1; // Question: shouldn't r1 here just be replaced by the original object, which is **non-const**?

书在撒谎。C++引用是“代码> *const < /COD>指针,伪装成一些特殊的语法。常量引用可以延长临时引用的寿命,而指针不能。就这样


引用的发明只是为了方便运算符重载的语法。我仍然喜欢引用并使用它们,但我并不幻想它们是“神奇的”和“与指针完全不同的”。

首先,提供的代码无效,因为您无法用常量引用初始化非常量引用

关于你的问题,可以更容易地将引用看作是对对象的一种特殊指针,它被自动引用(你引用的句子是相当误导的)。


更长的回答:你不能那样做。一旦你有了一个
常量&
它就会一直保持常量(除非你做了常量转换或其他一些明确的事情)。这是通过设计实现的,否则const correction实际上意义不大,这也是您无法编译代码的原因。

您的问题很困惑,无论如何,分配给引用并不会改变原始对象的constance

你的代码如果没有它就无法编译

int&r2=const\u cast(r1);

您可以使用
const\u cast
来消除常量。

为什么
int&r2=r1失败是因为当引用将r2与r1关联时,您删除了cv限定符
const

<>参见C++标准工作草案,85.3/5:

如果T1是与T2相关的参考,则cv1应与或大于相同的cv资格 cv资格比,cv2


这不仅仅是语法问题。语义完全不同。“C++引用是伪装的指针”——只是作为实现细节。就语言而言,引用只是别名,具有不同的语义。这些书是正确的。@CaptainObvlious“别名和不同的语义”和“用一些特殊语法伪装的指针”有什么区别。第二种描述会减少初学者的混淆。@juanchopanza除了常量引用可以扩展临时引用之外,指针和引用除了语法之外还有什么区别?引用不能默认初始化。创建后引用无法绑定到其他对象。奇怪的是,我发现更容易将引用视为一个且只有一个对象的别名。将引用视为指针会增加各种混淆,尤其是当您试图“分配”引用时。@juanchopanza引用的发明只是为了使用方便的语法允许运算符重载,因为使用指针参数需要在代码中使用太多的&和*符号。如果要这样做,您需要购买一张到UB Land的公共汽车票,因为您可能会在那里结束。@CaptainObvlious Yes。但是我认为OP的代码是可以的,因为原始变量
I
不是常量变量。“原始变量
I
不是常量变量”-没关系。一旦他们试图修改它(
r1
),他们就会引入未定义的行为。引入或依赖未定义的行为永远都是不正确的。@CaptainObvlious只有当原始对象被声明为常量时,它才是未定义的行为。但这不是一个好的做法。
int& r2 = const_cast<int&>(r1);