Ciao
A me sembra strano: la prima assegnazione
p_ad[0] = 2;
dovrebbe funzionare senza problemi, perché scrivendo
const double ad[3] = {1,2,3};
double * p_ad = const_cast(ad);
p_ad[0] = 2;
é esattamente come scrivere
double ad[3] = {1,2,3};
ad[0] = 2;
il const_cast non cambia il valore del puntatore ma rende soltanto scrivibile la memoria alla quale punta.
E mi sembra anche strano che ti funzioni il secondo cast
double * p_noarray = const_cast(noarray)
stai tentando di trasformare un (double) in (double *). Come hai detto, giustamente, il C++ é attento ai tipi, quindi non dovrebbe permettertelo.
Che compilatore stai usando?
Appena rientro a casa provo a compilare il tuo esempio e ti potrò confermare o meno quanto ti ho detto.
Ciao
dahman