我有一个大型库,它实现了一些不可变的数据结构。可以想象,其中几乎所有内容都是 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/