额。我上面没说详细,再补充一下,首先const限定符必须初始化!但是这个初始化分运行时初始化和编译时初始化两种,我上面所说的可以替代指的是编译时初始化的情况,就像这种形式,const int a = 5。但是!像这种形式,int b = 100; const int a = b; 你用一个非常量b去初始化const,这就叫运行时初始化,它仅仅是一个运行时不变的量了,像这种情况就不会在编译时期做替代了,所以你没法用这个const去初始化一个数组。就像你说的这个程序,如果你改写成下面这样,结果就和你的设想一样了。
所以为了确定到底是编译时初始化,还是运行时初始化,C++11引入了constexpr,如果你把上述代码的const int c = b; 改成 constexpr int c = b; 就会报错,constexpr不允许运行时初始化的情况。
(以下是我的理解,但我不太敢确定,能不能去掉底层const你还得去问大牛。)
至于讨论能不能被const_cast去掉底层const我并不敢确定,因为书中说了这是一种未定义的行为,可能不同编译器有不同的表现,所以我认为应该尽量避免通过去掉底层const的指针来给const变量写值。