【发布时间】:2011-03-16 10:54:02
【问题描述】:
最近我发现一段 C++ 代码可以有效地执行以下操作:
char* pointer = ...;
const char* constPointer = const_cast<const char*>( pointer );
显然作者认为const_cast的意思是“添加const”,但实际上const也可以隐式添加:
const char* constPointer = pointer;
在任何情况下我真的需要const_cast to 指向常量的指针(如上例中的const_cast<const Type*>)?
【问题讨论】:
-
我能想到的只有一个是强制模板实例化的特定类型 - 或重载解决方案。
-
一个有趣的问题,虽然我不明白为什么这会使构造更有用,但您可以使用
const_cast来添加或减去volatile以及const。 -
我也想知道它与 static_cast 有何不同
-
@Omnifarious:确实,这就是为什么不使用
const_cast来添加const。 C++ 中受限转换的全部意义在于,您可以使用尽可能少的转换,包括您想要的转换。我想知道编写一个implict_cast模板是否有用,它允许您在代码中发出转换正在发生的信号,但要确保只执行隐式转换。因此,您不会意外删除volatile(如将const_cast移至指针类型)或使用显式构造函数(如将static_cast移至类类型)。 -
@StackedCrooked:当目标是
const char*时,我认为唯一的区别是const_cast可以删除volatile,而static_cast不能。但是,对于指向类类型的指针,const_cast不会向上转换或(更重要的是)向下转换,static_cast会。基本上,当源类型与您想象的不完全一样时,它们会以不同的方式意外地做一些您不想要的事情。
标签: c++ casting constants const-correctness