0

鉴于此代码(来自我的上一篇文章

  const int j = 5; // constant object
  const int *p = &j; // `p` is a const access path to `j`

  int *q = const_cast<int *>(p); // `q` is a non-const access path to `j`
  *q = 10;

  cout << *q << endl;

输出是:10

应该是这样吗?我认为这段代码应该导致未定义的行为,因为j它是一个 const 。我错了吗 ?

谢谢

4

3 回答 3

2

未定义的行为可以是任何东西——它可以做你想做的事,或者它可以摧毁宇宙。如果可能,请避免未定义的行为,因为我真的不想因为您太懒而无法正确做事而被破坏。

于 2012-07-14T14:55:13.237 回答
1

http://en.wikipedia.org/wiki/Undefined_behavior

如果提交这样的程序,这特别使编译器可以做任何最简单或最有效的事情。通常,之后的任何行为也是未定义的。特别是,从来不需要编译器诊断未定义的行为——因此,调用未定义行为的程序可能看起来编译甚至运行时没有错误,只是在另一个系统上失败,甚至在另一个日期失败。当发生未定义行为的实例时,就语言规范而言,任何事情都可能发生,也许什么都不会发生。

于 2012-07-14T14:55:03.293 回答
0

不需要太多优化器就可以意识到这一点

*q = 10;
std::cout << *q;
// not use q anymore

可以改写为

std::cout << 10;

并且q可以删除,因为现在不用了。

之后,pj不再使用,也可以删除。

所有这一切都假设没有在程序中输入任何未定义的行为。允许编译器做出的假设。

于 2012-07-14T15:54:59.420 回答