与第三方库正确使用const_cast
Using const_cast correctly with third party library
我有一个大型库,可以实现一些不变的数据结构。您可以想象,其中几乎所有内容都是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类型的侵入容器中包装。