在C ++中的一个* const *变量的const_cast之后的地址

时间:2015-01-28 22:26:47

标签: c++ const-cast

我知道以下应该是未定义的行为 因为原始变量是常量。但是,怎么可能呢 两个地址&x&rx是相同的,但值是 它们打印出来(我不说要抓住,因为它根本不可能), 不是。谢谢!

const int x=10;
int& rx = const_cast<int&>(x);
rx++;
cout << x << " and " << rx << endl;
cout << "is &x == &xr: " << (&x==&rx) << endl;

G ++ 4.9的输出是

10 and 11
is &x == &xr: 1

2 个答案:

答案 0 :(得分:1)

这显然是一种未定义的行为,因此,根据我的理解,这个问题不应该是它发生的原因,而是它发生的原因。

我不知道GCC如何翻译和优化代码,但我最好的猜测是在cout行中,x被编译时的const值所取代(其中编译器假定为10)。

查看生成的汇编代码可能会很有趣!

答案 1 :(得分:1)

编译器(嗯,clang ++ 3.7.0截至上周)确实优化了&#34;意图&#34;代码,无论其合法性如何:

    movl    $_ZSt4cout, %edi
    movl    $10, %esi
    callq   _ZNSolsEi
    movq    %rax, %rbx
    movl    $.L.str, %esi
    movl    $5, %edx
    movq    %rbx, %rdi
    callq   _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l
    movl    $11, %esi
    movq    %rbx, %rdi
    callq   _ZNSolsEi

一如既往,值得注意的是,未定义行为的行为确实涵盖了#34;你认为它会做什么&#34;以及&#34;不做什么你认为它会做什么&#34;,这一点在这里适用。

最初为const的值的

const_cast是未定义的行为,并且此时您放弃了对#34;理智的行为的所有权利&#34;来自编译器。现在发生的是编译器编写者认为正确的事情 - 如果这意味着实际上将值放在只读内存中,那么您的代码将无法成功更新值。但在这种情况下,它只是将x优化为常数10,而rx变为11 - 因为您实际上并没有#34;做&#34;其他任何与xrx相关的内容都是&#34;罚款&#34;按编制者标准。