正确使用const_cast与第三方库

时间:2018-03-26 05:46:21

标签: c++ c++11 boost

我有一个实现一些不可变数据结构的大型库。可以想象,其中几乎所有内容都是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)),但即使在阅读了我发现我冒险进入未定义行为领域的文档之后,它也一点也不清楚。

这里的任何指导都将受到赞赏(特别是任何完全避免这种情况的技术!)

由于

2 个答案:

答案 0 :(得分:0)

使用boost::cref(x)

  

boost :: cref(x)返回一个boost :: reference_wrapper(x)

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

答案 1 :(得分:0)

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

  

const_cast使得可以形成实际引用const对象的非const类型的引用或指针,或者指向实际引用易失性对象的非易失性类型的引用或指针。通过非const访问路径修改const对象并通过非易失性glvalue引用volatile对象会导致未定义的行为。

通常无法直接将const对象与侵入式容器结合使用。你可以做的是用你自己的非const类型包装你想要放入侵入式容器的类型。