Reputation: 1506
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 anexpression
of 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?
Upvotes: 1
Views: 699
Reputation: 279245
it helps to cast away constness of an expression of type Type
No, Type
is the type of the result, not the type of the operand.
What i think is const of this pointer should be casted away
this
has type const ConstTest*
. const_cast<ConstTest*>(this)
has type ConstTest*
. That's what "casting away const" from a pointer-to-const means.
I feel code should have been
ConstTest *c = const_cast<ConstTest>(*this)
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 a ConstTest*
by writing const_cast<ConstTest>
, you get it by writing const_cast<ConstTest*>
. Your preferred syntax is not available.
You can either do ConstTest &c = const_cast<ConstTest&>(*this)
or ConstTest *c = const_cast<ConstTest*>(this)
, so pick your favorite.
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 so and why it is not true in case of pointers?
It is true of pointers. ConstTest*
is not a reference type, and the result of const_cast<ConstTest*>(this)
is an rvalue. You then assign that value to the variable c
.
Upvotes: 4