我知道以下应该是未定义的行为
因为原始变量是常量。但是,怎么可能呢
两个地址&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
答案 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;其他任何与x
和rx
相关的内容都是&#34;罚款&#34;按编制者标准。