使用旧库时使用const_cast一定不好吗?

Is it necessarily bad to use const_cast when working with legacy libraries?

提问人:Alexey104 提问时间:8/11/2022 最后编辑:Remy LebeauAlexey104 更新时间:8/12/2022 访问量:138

问:

我正在为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);

如您所见,即使该函数不需要更改指向的数据,指针也不是,使其工作的唯一方法是使用 ,据我所知,从不推荐这样做。constconst_cast

这只是一个示例,但在实际代码中有很多这样的问题。

我想知道,为什么这些遗留库是以这种方式构建的?他们为什么不使用指针,而实际上应该使用指针?处理此类问题的最佳方法是什么?constconst

C++(英语:C++) 旧版代码 常播 常量指针

评论

8赞 apple apple 8/11/2022
这实际上几乎是使用的原因const_cast
2赞 NathanOliver 8/11/2022
const_cast这里很好。 实际上,只有当你抛弃的东西实际上是 const 时才是一个问题。您的基础数据实际上不是常量,因此没有问题。const_cast
4赞 Nathan Pierson 8/11/2022
另请回复:“应改用特殊的库函数......所以我看不到使用智能指针的好处“:您可能有兴趣将自定义删除器函数与 std::unique_ptrstd::shared_ptr 一起使用。
1赞 apple apple 8/11/2022
另请注意,不会通过指针传播,因此用户实际上可以修改对象。(据,它确实有指针成员)const
1赞 Spencer 8/11/2022
还有 Windows API!

答:

2赞 Useless 8/11/2022 #1

使用旧库时使用const_cast一定不好吗?

不。

设计需要大量 的代码通常是不好的,因为它表明你没有仔细考虑可变性。const_cast

你使用的库是在考虑常量正确性之前编写的,它们的设计缺陷不是你的错。适应它们是完全恰当的用法。const_cast

释放这些资源中的大多数不仅仅是调用 free(),应该使用特殊的库函数来代替(等),所以我看不到使用智能指针的好处::XftFontClose()::FcPatternDestroy()

您知道可以将智能指针与自定义删除器一起使用,对吧?好处 - 您不必在每个类中实现五种特殊方法 - 仍然存在。

最多,考虑编写一个零规则包装器类型,存储带有自定义删除器的(或或其他任何内容)。打字少了很多,烦人错误的机会也少了很多。std::unique_ptrstd::shared_ptr