Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

const to Non-const Conversion in C++

Tags:

c++

constants

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?

like image 399
Shang Wang Avatar asked Sep 05 '11 17:09

Shang Wang


People also ask

How do I remove a const?

The statement int* c = const_cast<int>(b) returns a pointer c that refers to a without the const qualification of a . This process of using const_cast to remove the const qualification of an object is called casting away constness. Consequently the compiler does allow the function call f(c) .

Can you change a const in C?

In C or C++, we can use the constant variables. The constant variable values cannot be changed after its initialization.

Can a const function return a non-const reference?

If the thing you are returning by reference is logically part of your this object, independent of whether it is physically embedded within your this object, then a const method needs to return by const reference or by value, but not by non-const reference.

Can you cast a const?

const_cast can be used to add const ness behavior too. From cplusplus.com: This type of casting manipulates the constness of an object, either to be set or to be removed.


2 Answers

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.

like image 192
Lightness Races in Orbit Avatar answered Oct 17 '22 08:10

Lightness Races in Orbit


Changing a constant type will lead to an Undefined Behavior.

However, if you have an originally non-const object which is pointed to by a pointer-to-const or referenced by a reference-to-const then you can use const_cast to get rid of that const-ness.

Casting away constness is considered evil and should not be avoided. You should consider changing the type of the pointers you use in vector to non-const if you want to modify the data through it.

like image 40
Alok Save Avatar answered Oct 17 '22 07:10

Alok Save