as I said, you need to unlock that segment via system function, I did that like 10years ago on Win95 if I recall correctly, to change const strings during startup time.
note also, that if you take the address, you actually need to make it static const, just naming it const would result in a different address for every translation unit, unless you have just one uber/unity file, it might cause you a lot of trouble. (e.g. if you push the address of a 'stop' flag into a queue and check for it in another translation unit).
afaik, enums are rvalues, you cannot have those kind of misstakes.
I also suggest to not overgeneralize one compiler and platform as a proof of something, if you compile for e.g. ARM for gameboy advance, and you have a const int which has more than 24bit set (e.g. 0xffffffff), then there is no instruction to create that 0xffffffff in one cycle, the compiler starts to be 'smart' and loads that data from a global address space, which usually cost you more than those instructions that are needed to create the 0xffffffff by computation, an enum can help (even then compilers sometimes try to cluster those).
You're right that the const will be embeded, on an x86, tho