如何解决如何在非常量指针集合中搜索常量指针?
我有一个成员变量readline
,即非常量原始指针的集合,只想检查另一个指针的存在。
为了保持const正确性,我的函数如下所示:
std::set<T*> m_associates;
但是,由于bool MyClass::is_associated(const T* x) const
{
return (m_associates.find(x) != m_associates.end());
}
作为x
传递,表明const T*
指向的值未被函数更改,而x
却不能编译包含非常量m_associates
。
如果我从T*
参数中删除了const
,它将编译但违反了const正确性...
将x
添加到const
,即m_associates
也不是一种选择,因为我需要在类的其他地方使用非常量指针。
我该如何解决?这是(可能是唯一的)应该使用std::set<const T*> m_associates;
的地方吗?还是我必须始终将所有参数const_cast
指针作为非常量传递?
编辑: 完整的错误输出,编译器为clang ++-8,代码位于C ++ 17
T
解决方法
当前代码失败的原因是Compare
的默认std::set<T>
为std::less<T>
;强制两个参数都为一个T
以进行比较-在这种情况下,非const
T*
类型。由于const T*
不能转换为T*
,而又不放弃常量性,因此会导致编译错误。
如果您使用的是C ++ 14或更高版本,则可以重新定义std::set
,以使Compare
模板类型是透明的比较器(可以推断出基础类型进行比较),例如std::set<T*,std::less<>>
。这将启用std::set::find
的重载,该重载将推导类型并将参数转发给比较器,从而使上述代码能够正常工作。
在这种情况下,您可以消除const
的{{1}}风格,而不会产生不良影响。
除了可能暗示设计缺陷外,您还需要抛弃x
的 only 事情是,尝试修改最初使用{声明的对象时的行为通过非const
指针的{1}}未定义。这里不是这种情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。