我经常在C ++书籍中看到如下的陈述:
引用只是原始对象的另一个名称。使用时,它将被原始对象替换(在大多数情况下)。
以下是问题: 如果我将const ref绑定到非const对象,当这个const ref被原始对象使用并替换时,const-ness会消失吗?
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**?
答案 0 :(得分:2)
简单回答:否
更长的答案:你做不到。一旦你有一个const &
它将永远保持const(除非你做constcast或其他一些明确的事情)。这是设计的,否则const-correctness不会真正意义重大,也是你无法编译代码的原因。
答案 1 :(得分:0)
首先,提供的代码无效,因为您无法使用常量引用初始化非常量引用。
关于你的问题,可能更容易将引用视为对象的一种特殊的指针,它会被自动引用(你引用的句子非常具有误导性)。
答案 2 :(得分:0)
您的问题很困惑,无论如何,分配给引用不更改原始对象的常量。
您的代码不会在没有const_cast的情况下编译。
int& r2 = const_cast<int&>(r1);
您可以使用const_cast
来删除常量。
答案 3 :(得分:0)
int & r2 = r1;
失败的原因是,当引用 - 将r2与r1相关时,你删除了cv-qualifier const
。
参见C ++标准工作草案,n3797,8.5.3 / 5:
如果T1与T2有参考关系,则cv1应与cv-qualified相同或更高 cv-qualification,cv2。
答案 4 :(得分:-1)
书在撒谎。 C ++引用是伪装的* const
指针,带有一些特殊的语法。 const引用可以延长临时的生命,指针不能。那就是它。
仅发明了引用,以便为运算符重载提供方便的语法。我仍然喜欢参考并使用它们,但我并不幻想它们是“神奇的”#34;和&#34;与指针完全不同&#34;。