const_cast to" void pointer"来自" const T指针"失败

时间:2016-11-10 22:03:51

标签: c++

为什么以下代码无法编译?

CFDictionaryRef dictionary;

CFDictionaryApplyFunction(dict,set,const_cast< void *>(字典));

 error: const_cast from 'CFDictionaryRef' (aka 'const __CFDictionary *') to 'void *' is not allowed
    CFDictionaryApplyFunction(scoped, setDictionary, const_cast<void *>(dictionary));
                                                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

如果我将c样式类型转换为void *它可以正常工作

CFDictionaryApplyFunction(dict,set,(void *)字典);

1 个答案:

答案 0 :(得分:1)

执行reinterpret_cast<void *>(const_cast< __CFDictionary * >(dictionary))

const_cast仅用于在const指针或引用与其非const等效项之间进行转换。要转换为其他类型(在您的情况下为void*),您需要使用reinterpret_castreinterpret_cast基本上&#34;重新解释&#34;相同的位序列作为不同的类型。但是,不允许抛弃constness,所以你需要同时使用两个强制转换。

编辑:正如@AnT指出的那样,由于目标是void *,您可以使用static_cast代替reinterpret_cast。事实上,它被认为更安全,因为标准保证您获得相同的地址。另一方面,reinterpret_cast仅保证通过reinterpret_cast第一次强制转换的结果获得原始值。但是,这仅适用于一组受限制的转换(void *,Base-derived类对)。 reinterpret_cast更为通用,尽管您依靠编译器来做合理的事情。