什么是旧式演员的命名演员:pv =(void *)ps;

时间:2012-10-23 10:13:38

标签: c++

旧样式代码:

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

如你所见。什么都行不通。

5 个答案:

答案 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并查看潜在的危险地点。