I was reading about const_cast operator in c++
1.First weird thing thing i can’t understand is
const_cast operator syntax i.e.
-const_cast–<–Type–>–(–expression–)——————–><
what i have understand about this syntax is that it helps to cast away constness of anexpressionof type Type .But consider this code
class ConstTest {
private:
int year;
public:
ConstTest() : year(2007) {}
void printYear() const;
};
int main() {
ConstTest c;
c.printYear();
return 0;
}
void ConstTest::printYear() const {
ConstTest *c = const_cast<ConstTest*>(this);
c->year = 42;
std::cout << "This is the year " << year << std::endl;
}
Here in line ConstTest *c = const_cast<ConstTest*>(this), I think that the const of this pointer should be cast away, but the output shows that it is the object which this refers to that loses its const-ness.
I feel that the code should have been ConstTest *c = const_cast<ConstTest>(*this), but this produces an error. I know i am wrong at many interpretations. Please correct them all.
2.my second problem is the statement given below
The result of a const_cast expression is an rvalue unless Type is a reference type. In this case, the result is an lvalue.
Why is this so, and why it is not true in case of pointers?
No,
Typeis the type of the result, not the type of the operand.thishas typeconst ConstTest*.const_cast<ConstTest*>(this)has typeConstTest*. That’s what “casting away const” from a pointer-to-const means.The result of
const_cast<T>has type T, that’s how it’s defined. Maybe you would have defined it differently, but tough luck, you don’t get aConstTest*by writingconst_cast<ConstTest>, you get it by writingconst_cast<ConstTest*>. Your preferred syntax is not available.You can either do
ConstTest &c = const_cast<ConstTest&>(*this)orConstTest *c = const_cast<ConstTest*>(this), so pick your favorite.It is true of pointers.
ConstTest*is not a reference type, and the result ofconst_cast<ConstTest*>(this)is an rvalue. You then assign that value to the variablec.