【问题标题】:Can reference and the variable it is pointing to have different values? [duplicate]引用和它指向的变量可以有不同的值吗? [复制]
【发布时间】:2016-05-05 12:58:45
【问题描述】:

我不明白为什么在下面的代码中 sn-p 引用及其相关变量给出了不同的结果。

const int x = 10;
const int &ptr = x; 
int& y = const_cast<int&>(ptr);
y = 19;
std::cout << "x = " << x << " ptr=" << ptr << " y=" << y << std::endl;

输出:

x=10 ptr=19 y=19

根据我的理解,引用只是变量的别名,那么为什么 ptr19x10?这与constconst_cast 有关吗?

【问题讨论】:

  • 这是未定义的行为。你的冰箱可能会爆炸,就像你得到这个结果一样。
  • 修改常量值时,行为未定义。

标签: c++ casting reference constants


【解决方案1】:

来自5.2.11 常量转换 [expr.const.cast]

注意:根据对象的类型,通过指针、左值或指针进行写操作 到由 const_cast 产生的数据成员丢弃 const 限定符可能会产生 undefined 行为 (7.1.6.1)。 ——尾注]

您正在执行未定义的行为,因此您很(不)幸运您的计算机没有内爆。 :)

【讨论】:

  • @Humam 因为每个人都希望自己的电脑坏掉?
  • @HumamHelfawi 我想这取决于您是开发人员还是用户。 :) 如果我是一个因为 dev 依赖 UB 而导致软件无法运行的用户,我可能希望他的电脑也崩溃。
  • @LogicStuff 内爆比未捕获的 UB 更好
  • @HumamHelfawi 为您添加了一个小注释。 ;)
  • 提及int x; int const &amp; cx = x; const_cast&lt;int &amp;&gt;(cx) = 19; 之类的内容不会导致未定义的行为可能会有所帮助。
【解决方案2】:

这与constconst_cast 有关吗?

是的。

即使使用const_cast,修改最初为const 的对象仍然是未定义的行为。或者,换句话说,使用const_cast 写入const 对象是非法的。

【讨论】:

  • 我知道。这就是为什么我说 modify / write 是非法的。
  • 在我看来,如果你做了演员表但没有做写操作,这意味着写访问权限没有被授予。所以我看不出这种说法是错误的。不过,我很可能是错的,因为英语不是我的母语,所以请随时编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 2015-01-31
  • 2021-04-03
  • 1970-01-01
  • 2015-02-16
  • 2022-08-19
  • 1970-01-01
  • 2017-02-01
  • 2011-08-06
相关资源
最近更新 更多