提问人:Alexey104 提问时间:8/11/2022 最后编辑:Remy LebeauAlexey104 更新时间:8/12/2022 访问量:138
使用旧库时使用const_cast一定不好吗?
Is it necessarily bad to use const_cast when working with legacy libraries?
问:
我正在为Linux编写一个C++程序。我使用许多低级库,例如 XLib、FontConfig、Xft 等。它们都是用纯 C 编写的,在我的代码中的某些地方我遇到了这个烦人的问题:
我将 C 结构包装在对 RAII 友好的类中,其中资源在构造函数中分配,并在析构函数中释放。释放这些资源中的大多数不仅仅是调用,应该使用特殊的库函数(等),所以我看不到使用智能指针的好处。取而代之的是,我在类中保留了指向库资源的只读原始指针,并提供 getter 函数,返回指向这些资源的常量指针,以便无法在拥有它们的类之外修改它们。free()
::XftFontClose()
::FcPatternDestroy()
例如,我有一个包含系统字体排序列表的类,我可以要求这个类查找并打开可用于绘制特定字符的最佳字体:
const ::XftFont* FontHandler::findBestFont(wchar_t character);
调用者应该不能修改返回的指针指向的基础对象,这是类的方法/析构函数的任务。
问题是,我想传递返回的指针的大多数函数如下所示:
void
XftDrawStringUtf8
(XftDraw *d,
XRenderColor *color,
XftFont *font, // It is not const
int x,
int y,
XftChar8 *string,
int len);
如您所见,即使该函数不需要更改指向的数据,指针也不是,使其工作的唯一方法是使用 ,据我所知,从不推荐这样做。const
const_cast
这只是一个示例,但在实际代码中有很多这样的问题。
我想知道,为什么这些遗留库是以这种方式构建的?他们为什么不使用指针,而实际上应该使用指针?处理此类问题的最佳方法是什么?const
const
答:
使用旧库时使用const_cast一定不好吗?
不。
设计需要大量 的代码通常是不好的,因为它表明你没有仔细考虑可变性。const_cast
你使用的库是在考虑常量正确性之前编写的,它们的设计缺陷不是你的错。适应它们是完全恰当的用法。const_cast
释放这些资源中的大多数不仅仅是调用 free(),应该使用特殊的库函数来代替(等),所以我看不到使用智能指针的好处
::XftFontClose()
::FcPatternDestroy()
您知道可以将智能指针与自定义删除器一起使用,对吧?好处 - 您不必在每个类中实现五种特殊方法 - 仍然存在。
最多,考虑编写一个零规则包装器类型,存储带有自定义删除器的(或或其他任何内容)。打字少了很多,烦人错误的机会也少了很多。std::unique_ptr
std::shared_ptr
评论
const_cast
const_cast
这里很好。 实际上,只有当你抛弃的东西实际上是 const 时才是一个问题。您的基础数据实际上不是常量,因此没有问题。const_cast
const