C++ 将常量void*转换为其他没有常量强制转换的指针时出错

C++ 将常量void*转换为其他没有常量强制转换的指针时出错,c++,casting,constants,C++,Casting,Constants,功能 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; } int比较(常量无效*a,常量无效*b) { So

功能

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;
}
int比较(常量无效*a,常量无效*b)
{
SomeDataType g1=*(静态_转换(a));
SomeDataType g2=*(静态_cast(b));
g1.firstelement
这段代码返回一个错误,说“static cast不能从const void*转换到SomeDataType*”,我像const_cast一样使用它

SomeDataType g1 = *(static_cast<SomeDataType*>(const_cast<void*>(a))) ; 
somedatatypeg1=*(static_cast(const_cast(a));
让它工作起来。这样做对吗?还是我遗漏了什么?我不太明白这是怎么回事。

这样做:

const SomeDataType g1 = *static_cast<const SomeDataType *> (a);
const SomeDataType g2 = *static_cast<const SomeDataType *> (b);
使用常量

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

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

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

SomeDataType g1 = *(static_cat<const SomeDataType*>(a));
SomeDataType g1=*(静态_cat(a));
当然,这样做是为了复制数据,而应该这样做

const SomeDataType& g1 = *(static_cat<const SomeDataType*>(a));
const SomeDataType& g2 = *(static_cat<const SomeDataType*>(b));
g1.firstelement < g2.firstelement ? 1 : -1;
constsomedatatype&g1=*(static_cat(a));
const SomeDataType&g2=*(static_cat(b));
g1.firstelement
静态\u cast无法从指针中删除常量,也不打算这样做。唯一能做到这一点的演员是康斯特·卡斯特。所以你必须像你做的那样分两步施法。在你的例子中,你不需要指针是非常量的。因此,您可以简单地执行以下操作:

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();
}
int比较(常量无效*a,常量无效*b)
{
const SomeDataType*g1=静态_转换(a);
const SomeDataType*g2=静态_cast(b);
g2->GetFirstElement()-g1->GetFirstElement();
}

假设您对所使用的字段实现了const accessor。

它感觉不正确,因为它不应该感觉正确。有人给了你一个指针,你在界面上承诺不会修改它,丢弃
常量就是违背了你的承诺(当然,不是真的,但是类型系统认为,如果丢弃常量,是因为你想修改对象,这会违背你的承诺)

我建议您不要删除
常量

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;
}
int比较(常量无效*a,常量无效*b)
{
SomeDataType g1=*(静态_转换(a));
SomeDataType g2=*(静态_cast(b));
返回g1.firstelement
那么:

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;
}
int比较(常量无效*a,常量无效*b)
{
const SomeDataType*g1=静态_转换(a);
const SomeDataType*g2=静态_cast(b);
返回g1->firstelementfirstelement?1:-1;
}

如果你想扔掉
常量
你必须使用
const\u cast
。什么是静态猫?根据我的经验,大多数猫都是静态的(换句话说,你有一个打字错误。我很高兴评论而不是纠正)。如果我错了,人们会纠正我,但这个代码是一个错误:当比较结束时,g1和g2会随着其包含的数据而消失。然后a和b成为悬挂的指针,并且必然会消失在遗忘中???@navderm:不,它们在退出函数后不会消失,因为
g1
g2
都是指针。当您显式删除指针时,指针将被销毁。在比较中创建指针不会使a和b在比较超出范围时挂起指针吗?否。您没有复制a或b引用的内存,而且您使用的是裸指针。此外,指针g1和g2是本地的(这并不重要)。嗯,我本以为g1和g2的析构函数会被调用,当比较超出范围时会把事情搞砸。但我想我错了,因为每次使用new时,我们都必须使用delete,所以。。很酷,谢谢!不幸的是,我无法更改函数的编写方式。因此,我必须坚持使用指针。无法编辑打字错误(少于6个字符)static\u cat应该是static\u cast
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;
}
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;
}