2012-07-14 44 views
0

鉴于此代码(从我的最后一个职位here):Const_cast允许将常量修改为导致const的路径?

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是一个常量。我错了吗 ?

感谢

+0

未定义的行为。 – Mahesh 2012-07-14 14:49:02

+2

所以你真正的问题是“是否允许一个未定义行为的程序向控制台输出'10 \ n'?答案是*是*。 – 2012-07-14 14:52:54

+0

您认为这导致了未定义的行为。它做了。哪里有问题? – 2012-07-14 14:55:02

回答

2

未定义的行为可以是任何事情 - 它可以做到你想做的事,或者它可以摧毁宇宙。如果可能的话,避免未定义的行为,因为我不想因为你太懒而不能正确地做事而被毁掉。

1

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

这是专门释放编译器做什么是最容易的或最有效的 ,应该这样的程序提交。一般而言,之后的任何 行为也是未定义的。特别是,从不要求 需要编译器诊断未定义的行为 - 因此,调用未定义行为的程序可能会出现编译,甚至 最初运行时没有错误,只会在另一个系统上失败,甚至在另一个日期上失败。当发生未定义行为的实例时,到目前为止,语言规范 可能会发生任何事情, 也许什么也没有。

0

它不会花费太多的优化来实现该

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

可以改写为

std::cout << 10; 

而且q可以去掉,因为现在不使用它。

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

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