鉴于此代码(来自我上一篇文章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。我错了吗 ?
谢谢
答案 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
,因为现在它没有被使用。
之后,p
和j
也不再使用,也可以删除。
所有这些假设你没有在程序中输入任何未定义的行为。允许编译器做出的假设。