与第三方库正确使用const_cast

Using const_cast correctly with third party library

本文关键字:const cast 第三方      更新时间:2023-10-16

我有一个大型库,可以实现一些不变的数据结构。您可以想象,其中几乎所有内容都是const合格的。有几个不是const的选择,例如参考计数器。为了处理嵌入在通过const方法和指针中的结构中的参考计数器,使用mutable关键字。Node中的示例。这效果很好,我对文档的读物说这很好。

我面临的问题是,我也想使用Boost。Intrusive容器跟踪数据结构的某些部分,但是这些容器没有const方法。

boost::intrusive::list my_bi_list; // as an example
struct Node {
  mutable boost::intrusive::list_member_hook<> bi_hook;
  mutable std::atomic<int> refcount;
  // const T a;
  // const T b;
  // ...
  inline void put() const {
    ...
    my_bi_list.push_back(*this); // PROBLEM here
  }
};

在上面的Node中,*this用于将当前的Node实例放在侵入性列表中,但是该接口采用非const参考,从而导致您的标准C 限制符丢弃错误。

我一直在阅读有关const_cast(例如push_back(const_cast<Node&>(*this)(的信息,但是即使阅读了我发现我正在冒险进入不确定的行为领域之后,也根本不清楚。

这里的任何指导都将不胜感激(尤其是任何完全避免这种情况的技术!(

(

谢谢

使用boost::cref(x)

boost :: cref(x(返回boost :: reference_wrapper(x(

以这种方式,您正在使用Boost的参考库并进行隐式转换。

您正在冒险进入未定义的行为领域。来自cppreference(在注释下(:

const_cast使实际上是指实际指的是const对象的非CONST类型的参考或指针,或者指向实际上是指挥发性对象的非挥发性类型的引用或指针。通过非const访问路径修改常规对象,并通过非易失性glvalue参考挥发性对象会导致不确定的行为。

通常不可能直接将const对象与侵入容器结合使用。您可以做的是将要放入自己的非const类型的侵入容器中包装。