无法将'const pointer const'传递给const ref

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将'const pointer const'传递给const ref相关的知识,希望对你有一定的参考价值。

假设你有一组指针(是的......):

std::set<SomeType*> myTypeContainer;

然后假设您要从SomeType的const方法搜索此集合:

bool SomeType::IsContainered() const
{
    return myTypeContainer.find(this) != myTypeContainer.end();
}

这不起作用。该方法中的this ptr是const SomeType *const,我无法将其放入find。问题是find采用const-ref,在这种情况下,这意味着传递的指针被视为const,但不是它指向的东西。

有没有办法顺利解决这个问题(不改变设置的模板类型)?

答案

正如你所说,在const成员函数中,this变为const SomeType *(即指向const的指针),它不能被隐式转换为SomeType *(即指向非const的指针),这是find的预期参数类型。

您可以使用const_cast执行显式转换。

bool SomeType::IsContainered() const
{
    return myTypeContainer.find(const_cast<SomeType *>(this)) != myTypeContainer.end();
}

如果铸造结果不用于修改,那将是安全的;而std::set::find不会这样做。

另一答案

为了在有序容器中启用“混合”比较,您可以使用声明类型名称key_comparekey_compare::is_transparent类型。

set的默认比较仿函数类是std::less<Key>。它不是“透明的”。但std::less<void>是“透明的”,并且只要a形成良好,就可以对ba<b进行任何论证的比较。所以你可以定义自己的比较函子类型,或者你可以使用std::less<void>(或等效的std::less<>):

set<SomeType*,std::less<>> myTypeContainer;

以上是关于无法将'const pointer const'传递给const ref的主要内容,如果未能解决你的问题,请参考以下文章

Qt4 C++ Pointer to const QList of pointers

const char**与char**之间赋值问题

为啥没有为“T* const”定义pointer_traits?

const pointers

“No-Const Pointer to Const”调用函数

错误:对类型为'const ItemInstance'的引用无法绑定到类型为'void'的右值