提供该运算符的原因是,有时候可能需要这样一个值,它在大多数时候是常量,而有时又是可以修改的。在这种情况下,可以将这个值声明为const,并在需要修改它的时候,使用const_cast。这也可以通过通用类型转换来实现,但通用类型转换也可能同时修改类型。
语法为:
const_cast<type-name>(expression)
如果类型的其他部分也被修改,则上述类型转换将出错。也就是说。除了const特征可以不同外,type_name和expression的类型必须相同。假设High和Low是两个类:
High bar;
const High *pbar = &bar;
...
High *pb = const_cast<High *>(pbar); // valid
const Low *pl = const_cast<const Low *>(pbar); //invalid
由于编程时可能无意间同时改变类型和常量特征,因此使用const_cast运算符更安全。
const_cast不是万能的,它可以修改指向一个值的指针,但修改const值的结果是不确定的。程序清单1.1的简单示例阐明了这一点:
#include<iostream>
using namespace std;
void change(const int *pt, int n);
int main()
{
int pop1 = 38383;
const int pop2 = 2000;
cout << "pop1,pop2: " << pop1 << ", " << pop2 << endl;
change(&pop1, -103);
change(&pop2, -103);
cout << "pop1,pop2: " << pop1 << ", " << pop2 << endl;
return 0;
}
void change(const int *pt, int n)
{
int *pc;
pc = const_cast<int *>(pt);
*pc += n;
}
const_cast运算符可以删除const int *pt中的const,使得编译器能够接受chang()中的语句:
*pc += n;
但由于pop2被声明为const,因此编译器禁止修改它,如下面的输出所示:
pop1,pop2: 38383, 2000
pop1,pop2: 38280, 2000