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)
所以我们没有必须进行转换,但它使第一个解决方案成为一个单行,而不需要创建临时变量.
const_cast尽管它的名字,但并不具体const; 它适用于cv-qualifiers,它有效地包含const和volatile.
虽然允许透明地添加这样的限定符,但删除任何限定符需要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)
例如,这可能出现在驱动程序代码中.
| 归档时间: |
|
| 查看次数: |
4072 次 |
| 最近记录: |