当const ref被原始对象(非const)替换时,const-ness会消失吗?

时间:2014-07-09 14:59:37

标签: c++ const object-reference

我经常在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**?

5 个答案:

答案 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;。