I am confused that why following code is not able to compile
int foo(const float* &a) {
    return 0;
}
int main() {
    float* a;
    foo(a);
    return 0         
        Because it isn't type-safe. Consider:
const float f = 2.0;
int foo(const float* &a) {
    a = &f;
    return 0;
}
int main() {
    float* a;
    foo(a);
    *a = 7.0;
    return 0;
}
Any non-const reference or pointer must necessarily be invariant in the pointed-to type, because a non-const pointer or reference supports reading (a covariant operation) and also writing (a contravariant operation).
const must be added from the greatest indirection level first.  This would work:
int foo(float* const &a) {
    return 0;
}
int main() {
    float* a;
    foo(a);
    return 0;
}