По мотивам срача, где stevejobs предложил пример того, почему const не даёт никаких гарантий.
Я заметил такое поведение у себя:
#include <cstdio>
#include <cassert>
int main() {
const int three = 3;
printf( "three=%d\n", three );
int *ptr;
ptr = (int *)( &three );
*ptr = 5;
printf( "three=%d\n", three);
assert(three == 3);
}
Выхлоп:
$ g++-4.7 -Wall -Wextra -O0 test.cpp -o test
$ ./test
three=3
three=3
При этом в отладчике:
(gdb) b 8
Breakpoint 1 at 0x4006ff: file test.cpp, line 8.
(gdb) r
Starting program: /home/del/test/const/test
three=3
Breakpoint 1, main () at test.cpp:9
9 ptr = (int *)( &three );
(gdb) p three
$1 = 3
(gdb) p &three
$2 = (const int *) 0x7fffffffe2d4
(gdb) n
10 *ptr = 5;
(gdb) p ptr
$3 = (int *) 0x7fffffffe2d4
(gdb) n
12 printf( "three=%d\n", three);
(gdb) p *ptr
$4 = 5
(gdb) p three
$5 = 5
(gdb) n
three=3
Что собственно происходит? Почему (судя по gdb) по адресу 0x7fffffffe2d4 лежит 5, и three == 5, но printf выводит 3, и не срабатывает assert() ?
Если убрать 'const', то всё нормально и никаких аномалий нету.
Тестировал на gcc 4.2, 4.6 и 4.7.
PS вообще C-style cast'ы зло, static_cast<> тут законно ругнётся.