关于const_cast强制转换的问题
来源:9-8 const_cast的使用
Autonomy7269969
2020-05-20
查了相关的资料,说如果const_cast强制转换本身为const对象会造成“未定义行为”的情况,const对象是不允许改变的。
所以要想安全的使用const_cast,就要程序员确认是否转换的对象是否本身就是const对象,而非const修饰的对象。
比如:
函数传参的时候,函数参数表里面要求传入一个非const对象参数,而此时const对象要传入此函数,为了避免重载此函数可以使用const_cast表面的在参数表中修改const对象为非const修饰对象(实际还是const对象)。而实际进入函数后此对象依旧不能进行改变,一旦改变就会引发“未定义的行为”。或者传参要求进入的参数为const对象,而实际传入的对象并非const对象,通过函数体内使用const_cast进行强制转换去掉const,使此非const对象能在函数体内解放,自由赋值。
所以在使用const_cast时,要确认所作用的对象是否为const对象(即初始化声明的时候是否为const),然后再决定此对象的行为。不管是否解放const修饰符的限制,const对象不允许改变的原则不会变。
所以问题来了。老师,const声明时和后期修饰const的对象为啥会有这种差别呢?const修饰的变量为只能读的变量。
1回答
-
quickzhao
2020-05-20
没看懂你的提问。我们在学习C++语言时要尽量找到实际的场景解决实际问题,尽可能别从唯物论的角度来学习C++,不然很容易专牛角尖,因为C++的知识点太过庞大。const_cast一个主要的场景是在传参时:如果有一个函数,它的形参是non-const类型变量,而且函数不会对实参的值进行改动(const的量由编译器保证不变),此时如果使用类型为const的变量来调用函数,则可以使用const_cast。
00
相似问题