作为一个通用规则,const_cast<>()
在C++代码中使用它通常被认为是一种不好的做法,因为它(大多数情况下)揭示了设计中的一个缺陷.
虽然我完全同意这种说法,但是我不知道什么是例使用const_cast<>()
是确定和唯一的解决办法.
你能不能给我一些你认识/遇到过的例子?
非常感谢你.
GMa*_*ckG 18
像其他人所说的那样,它的主要目的是const
从对象中删除以传递给非常规的正确函数,你知道这些函数不会修改参数.
有一个技巧(由Meyers?)来避免代码重复,它是这样的:
struct foo
{
const return_type& get(void) const
{
// fancy pants code that you definitely
// don't want to repeat
return theValue; // and got it
}
return_type& get(void)
{
// well-defined: Add const to *this,
// call the const version, then
// const-cast to remove const (because
// *this is non-const, this is ok)
return const_cast<return_type&>(static_cast<const foo&>(*this).get());
}
};
Run Code Online (Sandbox Code Playgroud)
Tim*_*sch 10
我同意你的陈述,它的正常使用是因为你需要隐藏"设计缺陷".
IME的典型使用场景之一是当您尝试将C++与现有C代码接口时.许多现有的C代码都采用C字符串,char *
即使字符串未被修改,而它们通常表示为const char *
在C++ 中转换为a的字符串.这是通常使用const_cast解决的两种语言之间的阻抗不匹配.当然,你最好是非常确定你与接口的代码没有得到关于修改在传递数据的任何可爱的想法.
我会说这是新编写的代码中的代码,但是为了与旧的C和C++代码接口,这是一个必要的恶魔.也就是说,我会非常警惕const_cast
任何非POD对象所需的代码,因为这通常是一个应该在设计级而不是代码级解决的问题.
(在我看来)一种合法用途是与std::set
迭代器一起使用。它们始终为const
,以防止更改集合中使用的密钥。更改密钥会破坏集合的内部结构,并导致未定义的行为。
但是,只要密钥不变,就可以安全地更改对象中的其他数据。
假设您有一个std::set
类似这样的人:
std::set<MyObject> some_set;
Run Code Online (Sandbox Code Playgroud)
像这样的课:
class MyObject {
public:
MyObject(const std::string &key)
: key_(key) {}
bool operator<(const MyObject &other) const {
return key_ < other.key_;
}
private:
// ...
// <some other data>
// ...
const std::string key_;
};
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,键已经是const,因此,即使您修改对象,也无法破坏集合的内部结构。
通常,您只能从const
集合迭代器中获取引用:
const MyObject &object = *some_set_iterator;
Run Code Online (Sandbox Code Playgroud)
但是由于键是const
,所以const_cast
对于取消引用的迭代器是安全的:
MyObject &object = const_cast<MyObject &>(*some_set_iterator);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16249 次 |
最近记录: |