从常量引用初始化非常量引用

Initialization of non constant reference from a constant reference

本文关键字:常量 引用 非常 初始化      更新时间:2023-10-16
int main(){   
  int x = 10;
  const int&z = x;
  int &y = z; // why is this ill formed?
}

为什么将int的非常量引用初始化为常量引用不正确?这背后的原因是什么?

好吧,为什么它不应该是格式错误的?

它是不正规的,因为它打破了常量更正的明显规则。在C++语言中,不允许将常量访问传递隐式转换为非常量访问路径。指针和引用也是如此。这就是拥有恒定访问路径的全部目的:防止修改路径导致的对象。一旦您将其设置为恒定,就不允许返回到非恒定,除非您通过使用const_cast做出明确和有意识的努力。

在这种特殊情况下,您可以通过使用const_cast(这就是const_cast的作用(轻松地从访问路径中删除常量,并合法地修改引用的对象,因为引用的对象并不是真正的常量

int main(){   
  int x = 10;
  const int &z = x;
  int &y = const_cast<int &>(z);
  y = 42; // modifies x
}

由于y不是const,因此您也可以编写y = 42并更改z(即const(。

因为常量引用是不可修改的,而标准引用是.

编译器假设const int&是const int,尽管在本例中它不是。不能使非常量引用引用const int,因为这样就可以通过引用更改(名义上(const int。

因为

int const x = 10;
int const& z = x;
int& y = z;
y = 42;

将修改常量变量。

正如其他人所说,它将允许间接更改x,这打破了常量正确性的承诺。看见http://en.wikipedia.org/wiki/Const_correctness