c++ - 在第三方库中正确使用 const_cast

标签 c++ c++11 boost

我有一个大型库,它实现了一些不可变的数据结构。可以想象,其中几乎所有内容都是 const合格的。有一些选择部分不是 const,例如引用计数器。为了处理嵌入结构中的引用计数器,这些引用计数器只能通过 const 访问。方法和指针,mutable使用关键字。下面的示例 Node .这很好用,我对文档的阅读表明这很好。

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

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侵入列表上的实例,但该接口(interface)采用非 const引用,导致您的标准 C++ 限定符丢弃错误。

我一直在阅读 const_cast (例如 push_back(const_cast<Node&>(*this) ),但即使在阅读了我发现我正在冒险进入未定义行为领域的文档之后,它也不是很清楚。

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

谢谢

最佳答案

使用boost::cref(x) :

boost::cref(x) returns a boost::reference_wrapper(x)

这样,您就可以使用 boost 的引用库并进行隐式转换。

关于c++ - 在第三方库中正确使用 const_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49484695/

相关文章:

c++ - 有没有一个很好的C++崩溃报告库,可以很好地与Visual Studio 2005一起使用?

c++ - 将指针分配给 vector 的差异

c++ - 使用 std 容器(如 vector 、列表、队列等)的稳定内存地址

c++ - 如何转换boost::fusion::vector的类型?

c++ - 类似 print END << END;在 C++ 中?

python - 如何使用 pybind11 在 C++ 线程中调用 Python 函数作为回调

c++ - 为什么从不可 move 类派生的类本身是可 move 构造的?

c++ - 通过 parent() 进行 qobject_cast 的可变参数模板

c++ - 闭源库包括 boost 分发

具有抽象基类的 C++ boost::ptr_map 导致插入问题