为什么以下代码无法编译?
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 *)字典);
答案 0 :(得分:1)
执行reinterpret_cast<void *>(const_cast< __CFDictionary * >(dictionary))
const_cast
仅用于在const
指针或引用与其非const
等效项之间进行转换。要转换为其他类型(在您的情况下为void*
),您需要使用reinterpret_cast
。 reinterpret_cast
基本上&#34;重新解释&#34;相同的位序列作为不同的类型。但是,不允许抛弃constness,所以你需要同时使用两个强制转换。
编辑:正如@AnT指出的那样,由于目标是void *
,您可以使用static_cast
代替reinterpret_cast
。事实上,它被认为更安全,因为标准保证您获得相同的地址。另一方面,reinterpret_cast
仅保证通过reinterpret_cast
第一次强制转换的结果获得原始值。但是,这仅适用于一组受限制的转换(void *
,Base-derived类对)。 reinterpret_cast
更为通用,尽管您依靠编译器来做合理的事情。