将const void *转换为没有const_cast的其他指针时出错

时间:2013-03-11 15:42:52

标签: c++ casting const

功能

int compare(const void* a, const void* b)
{
    SomeDataType g1 = *(static_cast<SomeDataType*>(a));
    SomeDataType g2 = *(static_cast<SomeDataType*>(b));
    g1.firstelement < g2.firstelement ? 1 : -1;
}

此代码返回一个错误,说明&#34;静态转换不能从const void *转换为SomeDataType *。&#34;我使用const_cast之类的

SomeDataType g1 = *(static_cast<SomeDataType*>(const_cast<void*>(a))) ; 

让这个工作。这是一种正确的方法吗?或者我错过了什么?我不太明白这是如何运作的。

6 个答案:

答案 0 :(得分:5)

感觉不对,因为感觉不对。有人给了你一个指针,你在接口中承诺你不会修改它,抛弃const违背了你的承诺(好吧,不是真的,但类型系统认为如果你抛弃const,是因为你想要修改对象,违背你的承诺。)

我建议你不要放弃const

int compare(const void* a, const void* b)
{
    SomeDataType g1 = *(static_cast<const SomeDataType*>(a));
    SomeDataType g2 = *(static_cast<const SomeDataType*>(b));
    return g1.firstelement < g2.firstelement ? 1 : -1;
}

答案 1 :(得分:2)

这样做:

const SomeDataType g1 = *static_cast<const SomeDataType *> (a);
const SomeDataType g2 = *static_cast<const SomeDataType *> (b);

此处您不需要const_cast

但是我更喜欢这个:

int compare(const SomeDataType &g1, const SomeDataType &g2)
{
    return g1.firstelement < g2.firstelement ? 1 : -1;
}

答案 2 :(得分:1)

为什么不像这样转换为const SomeDataType *

SomeDataType g1 = *(static_cat<const SomeDataType*>(a));

当然,这样做可以复制数据,相反,你应该这样做

const SomeDataType& g1 = *(static_cat<const SomeDataType*>(a));
const SomeDataType& g2 = *(static_cat<const SomeDataType*>(b));
g1.firstelement < g2.firstelement ? 1 : -1;

答案 3 :(得分:1)

static_cast无法从指针中删除const-ness,并不意味着这样做。只有施法才能做到这一点是const_cast。所以你必须像你一样分两步。在你的情况下,你不需要指针是非const的。所以你可以这样做:

int compare(const void* a, const void* b)
{
    const SomeDataType* g1 = static_cast<SomeDataType*>(a);
    const SomeDataType* g2 = static_cast<SomeDataType*>(b);
    g2->GetFirstElement() - g1->GetFirstElement();
}

假设您已经为您使用的字段实现了const访问器。

答案 4 :(得分:1)

怎么样:

int compare(const void* a, const void* b)
{
    const SomeDataType *g1 = static_cast<const SomeDataType*>(a);
    const SomeDataType *g2 = static_cast<const SomeDataType*>(b);
    return g1->firstelement < g2->firstelement ? 1 : -1;
}

答案 5 :(得分:0)

使用const!

const SomeDataType g1 = *(static_cast<SomeDataType const *>(a));

由于你不会改变g1,所以没有必要让它变成const。

您可能还需要return

return  g1.firstelement < g2.firstelement ? 1 : -1;

不确定你是否也关心g1 == g2?