我想知道以下如何工作@编译器级别.
int const iVal = 5; (int&)iVal = 10;
一点m/c或编译器级别的答案会非常充实.
提前致谢.
这是未定义的行为.
在第一行中,您定义一个常量整数.从此以后,在你的程序中,允许编译器用值5代替iVal.它可以从内存加载它,但可能不会,因为这不会带来任何好处.
第二行写入您的编译器告诉您包含数字5的内存位置.但是,这不能保证有任何影响,因为您已经告诉编译器该值不会更改.
例如,下面将定义一个包含5个元素的数组,并打印一个未定义的值(或者它可以做任何想做的事!它是未定义的)
int const iVal = 5; (int&)iVal = 10; char arr[iVal]; cout << iVal;
生成的程序集可能类似于:
sub ESP, 9 ; allocate mem for arr and iVal. hardcoded 5+sizeof(int) bytes ; (iVal isn't _required_ to have space allocated to it) mov $iVal, 10 ; the compiler might do this, assuming that you know what ; you're doing. But then again, it might not. push $cout push 5 call $operator_ltlt__ostream_int add ESP, 9
C风格的强制转换充当const_cast.就像你写的那样
const_cast( iVal ) = 10;
如果您碰巧这样做并且编译器决定不为iVal分配实际内存,则会遇到未定义的行为.
例如,VC7编译好吧.它甚至可以在调试模式下运行.在释放模式下,分配后iVal值不会改变 - 它仍为5.
所以你不应该这样做.