const_cast <const type * =“”>是否有用?</const>

时间:2011-03-16 10:54:03

标签: c++ casting const const-correctness

最近我发现了一段有效执行以下操作的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*>,如上例所示)?

4 个答案:

答案 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 ,它实际上包含constvolatile

虽然允许透明地添加这样的限定符,但删除任何限定符需要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*);
}