最近我发现了一段有效执行以下操作的C ++代码:
char* pointer = ...;
const char* constPointer = const_cast<const char*>( pointer );
显然作者认为const_cast
的意思是“添加const”,但实际上const
也可以隐含地添加:
const char* constPointer = pointer;
是否有任何情况我真的需要const_cast
指针指向const(const_cast<const Type*>
,如上例所示)?
答案 0 :(得分:10)
如果你有2个重载,并且你想强制执行const。当你用另一个调用一个时,通常就是这种情况。
class A
{
public:
B* get();
const B* get() const;
};
我有一个非const A,但想运行我可能会运行的get()const。特别是我可能会在非const本身的实现中这样做。
B* A::get()
{
return const_cast<B*>( const_cast< const A*>(this)->get() );
}
当然我们可以这样做:
B* A::get()
{
const A* constthis = this; // no need to cast
return const_cast<B*>(constthis->get());
}
所以我们没有必须进行转换,但它使第一个解决方案成为一个单行,而不需要创建临时变量。
答案 1 :(得分:5)
在你有f(T *)和f(const T *)的情况下,可能强制重载解析。
答案 2 :(得分:5)
const_cast
,尽管名称不同,但并非特定于const
;它适用于 cv-qualifiers ,它实际上包含const
和volatile
。
虽然允许透明地添加这样的限定符,但删除任何限定符需要const_cast
。
因此,在示例中,您给出:
char* p = /**/;
char const* q = const_cast<char const*>(p);
const_cast
的存在是虚假的(我个人认为它模糊了语法)。
但您可以删除volatile
,在这种情况下您需要它:
char const volatile* p = /**/;
char const* q = const_cast<char const*>(p);
例如,这可能出现在驱动程序代码中。
答案 3 :(得分:2)
您也可以使用static_cast
添加const。因此,我没有看到您必须使用const_cast
添加const
的任何情况。但是,当您想要更改对象的类型(例如重载解析)时,有时可能需要显式转换(无论是一个还是另一个)。
E.g。
void f(char*);
void f(const char*);
int main()
{
char* p = 0;
f(p); //calls f(char*)
f(static_cast<const char*>(p)); //calls f(const char*);
f(const_cast<const char*>(p)); //calls f(const char*);
}