4

旧式演员的代码:

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

如你看到的。没有任何效果。

4

5 回答 5

10

你应该const_cast,但要正确的类型。从string*to的转换void*将自动发生。

pv = const_cast<string*>(ps);
于 2012-10-23T10:16:15.557 回答
4

在这种特殊情况下,它很简单:

pv = const_cast<string*>( ps );

string*to的转换void*是隐式的。如果你想让它明确,你需要第二个单独的演员:

pv = static_cast<void*>( const_cast<string*>( ps ) );

或者

pv = const_cast<void*>( static_cast<void const*>( ps ) );

但是,我不认为将其明确化是特别必要的。您使用 a 的事实void*已经表明会有转换。

于 2012-10-23T10:20:55.727 回答
3

您必须首先删除 const-ness,然后再删除 static_cast:

pv = static_cast<void*>(const_cast<string*>(ps));
于 2012-10-23T10:16:36.273 回答
2

您只需要一个const_cast,因为转换为(但不是从)void*自动发生(从 void 转换,使用static_cast):

pv = const_cast<string*>(ps);
于 2012-10-23T10:18:47.533 回答
-1

我没有尝试 - 我猜你是 2 个演员 - 由于下面发布的链接,不应该使用它。

pv = reinterpret_cast<void*>(const_cast<string*>(ps));

根据 C++03,唯一安全的方法似乎是使用 static_cast 从/到 void*

pv = static_cast<void*>(const_cast<string*>(ps));

我不会使用隐式演员表,因为它隐藏了演员表。但你的演员阵容看起来是个坏主意——这是什么背景?


我刚刚发现何时使用 reinterpret_cast,现在我明白了为什么 static_cast 更好。我仍然不喜欢它,因为它在某种程度上隐藏了(在我看来)铸造无效的危险部分。在评论中,很容易简单地搜索所有 reinterpret_casts 并查看潜在危险的地方。

于 2012-10-23T10:15:57.383 回答