问题
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?
回答1:
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.
来源:https://stackoverflow.com/questions/9132315/behaviour-of-const-cast