c++constants

const to Non-const Conversion in C++


I'm really annoyed by const keyword these days, as I'm not quite familiar with it. I had a vector that stores all const pointers like vector<const BoxT<T> *> *Q_exclude, and in the constructor of another class, I need an element in this queue to be passed in as a parameter and assign it to a non-const member. My question is:

How do I assign a const variable to a non-const variable? I know this doesn't make sense because after all, a const is a const, and should not be changed by any mean. But that annoying member variable REALLY has to be changed during the process! I might also change the data type in the vector to be non-const, but that would be too much work. Or does anyone know how to avoid such situation?


Solution

  • You can assign a const object to a non-const object just fine. Because you're copying and thus creating a new object, constness is not violated.

    Like so:

    int main() {
       const int a = 3;
       int b = a;
    }
    

    It's different if you want to obtain a pointer or reference to the original, const object:

    int main() {
       const int a = 3;
       int& b = a;       // or int* b = &a;
    }
    
    //  error: invalid initialization of reference of type 'int&' from
    //         expression of type 'const int'
    

    You can use const_cast to hack around the type safety if you really must, but recall that you're doing exactly that: getting rid of the type safety. It's still undefined to modify a through b in the below example:

    int main() {
       const int a = 3;
       int& b = const_cast<int&>(a);
    
       b = 3;
    }
    

    Although it compiles without errors, anything can happen including opening a black hole or transferring all your hard-earned savings into my bank account.

    If you have arrived at what you think is a requirement to do this, I'd urgently revisit your design because something is very wrong with it.