我有一个实现一些不可变数据结构的大型库。可以想象,其中几乎所有内容都是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)
),但即使在阅读了我发现我冒险进入未定义行为领域的文档之后,它也一点也不清楚。
这里的任何指导都将受到赞赏(特别是任何完全避免这种情况的技术!)
由于
答案 0 :(得分:0)
答案 1 :(得分:0)
您正冒险进入未定义的行为领域。来自cppreference(在Notes下):
const_cast使得可以形成实际引用const对象的非const类型的引用或指针,或者指向实际引用易失性对象的非易失性类型的引用或指针。通过非const访问路径修改const对象并通过非易失性glvalue引用volatile对象会导致未定义的行为。
通常无法直接将const对象与侵入式容器结合使用。你可以做的是用你自己的非const类型包装你想要放入侵入式容器的类型。