const_cast <const Type*>是否有用?

sha*_*oth 11 c++ casting const const-correctness

最近我发现了一段有效执行以下操作的C++代码:

char* pointer = ...;
const char* constPointer = const_cast<const char*>( pointer );
Run Code Online (Sandbox Code Playgroud)

显然作者认为这const_cast意味着"添加const",但实际上const也可以隐含地添加:

const char* constPointer = pointer;
Run Code Online (Sandbox Code Playgroud)

有没有当我真的有任何情况下const_cast ,以一个指针到常量(const_cast<const Type*>如上面的例子)?

Cas*_*Cow 10

你有2个重载的地方,你想强制执行const.当你用另一个调用一个时,通常就是这种情况.

class A
{
public:
   B* get();
   const B* get() const;
};
Run Code Online (Sandbox Code Playgroud)

我有一个非const A,但想运行我可能会运行的get()const.特别是我可能会在非const本身的实现中这样做.

B* A::get() 
{
   return const_cast<B*>( const_cast< const A*>(this)->get() );
}
Run Code Online (Sandbox Code Playgroud)

我们当然可以这样做:

B* A::get()
{
    const A* constthis = this; // no need to cast
    return const_cast<B*>(constthis->get());
}
Run Code Online (Sandbox Code Playgroud)

所以我们没有必须进行转换,但它使第一个解决方案成为一个单行,而不需要创建临时变量.

  • @MaximYegorushkin:这将为[未定义的行为领域]打开大门(http://stackoverflow.com/a/123765/1969455)!对不起,您的评论很晚,但我认为此警告很重要。 (2认同)

Mat*_* M. 6

const_cast尽管它的名字,但并不具体const; 它适用于cv-qualifiers,它有效地包含constvolatile.

虽然允许透明地添加这样的限定符,但删除任何限定符需要a const_cast.

因此,在示例中,您给出:

char* p = /**/;
char const* q = const_cast<char const*>(p);
Run Code Online (Sandbox Code Playgroud)

const_cast虚假的存在(我个人认为它模糊了语法).

但你可以删除volatile,在这种情况下你需要它:

char const volatile* p = /**/;
char const* q = const_cast<char const*>(p);
Run Code Online (Sandbox Code Playgroud)

例如,这可能出现在驱动程序代码中.


zvr*_*rba 5

也许在你有f(T*)和f(const T*)的情况下强制重载解析.