Const_cast允许将const修改为导致const的路径?

时间:2012-07-14 14:47:56

标签: c++ const const-cast

鉴于此代码(来自我上一篇文章here):

  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。我错了吗 ?

谢谢

3 个答案:

答案 0 :(得分:2)

未定义的行为可以是任何东西 - 它可以完全按照您的意愿行事,也可以破坏宇宙。如果可能的话,避免未定义的行为,因为我真的不想因为你太懒而无法正确处理而被销毁。

答案 1 :(得分:1)

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

  

这使编译器可以自由地执行最简单或最简单的操作   如果提交这样的程序,效率很高。一般来说,任何   之后的行为也是不确定的。特别是,它永远不会   要求编译器诊断未定义的行为 - 因此,   调用未定义行为的程序可能看起来是编译甚至是   一开始运行没有错误,只在另一个系统上运行,甚至   在另一个日期。到目前为止,当发生未定义行为的实例时   就语言规范而言,任何事情都可能发生,   也许什么都没有。

答案 2 :(得分:0)

实现

的优化程序并不需要太多
*q = 10;
std::cout << *q;
// not use q anymore

可以改写为

std::cout << 10;

可以删除q,因为现在它没有被使用。

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

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