旧样式代码:
const string *ps;
void *pv;
pv = (void*)ps;
我尝试了三种不同的命名演员:
pv = static_cast<void*>(ps); // error: invalid static_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’
pv = const_cast<void*>(ps); // error: invalid const_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’
pv = reinterpret_cast<void*>(ps); // error: reinterpret_cast from type ‘const string* {aka const std::basic_string<char>*}’ to type ‘void*’ casts away qualifiers
如你所见。什么都行不通。
答案 0 :(得分:10)
你应该const_cast
,但是要正确的类型。从string*
到void*
的演员表将自动发生。
pv = const_cast<string*>(ps);
答案 1 :(得分:4)
在这种特殊情况下,它只是:
pv = const_cast<string*>( ps );
从string*
到void*
的转换是隐含的。如果你想
说清楚,你需要第二个独立的演员:
pv = static_cast<void*>( const_cast<string*>( ps ) );
或
pv = const_cast<void*>( static_cast<void const*>( ps ) );
但是,我并不认为明确说明这一点是特别必要的;该
事实上,您使用void*
已经说过会有。{1}}
转化
答案 2 :(得分:3)
首先删除const-ness然后再删除static_cast:
pv = static_cast<void*>(const_cast<string*>(ps));
答案 3 :(得分:2)
您需要的只是const_cast
,因为void*
的转换(但不是来自static_cast
)会自动发生(转换为void,请使用pv = const_cast<string*>(ps);
):
{{1}}
答案 4 :(得分:-1)
我没有尝试 - 我猜你是2个演员 - 由于下面发布的链接,不应该使用它。
pv = reinterpret_cast<void*>(const_cast<string*>(ps));
根据C ++ 03唯一安全的方法似乎是使用static_cast从/转换为void *
pv = static_cast<void*>(const_cast<string*>(ps));
我不会使用隐式强制转换,因为它隐藏了强制转换。 但你的演员看起来像个坏主意 - 这是什么背景?
我刚刚找到when to use reinterpret_cast,现在我明白为什么static_cast会更好。我仍然不喜欢它,因为它有点隐藏(在我看来)铸造无效的危险部分。在评论中,很容易简单地搜索所有reinterpret_cast并查看潜在的危险地点。