4

古いスタイルのキャストを使用したコード:

const string *ps;  
void *pv;

pv = (void*)ps;

3 つのさまざまな名前付きキャストを試しました。

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*からへのキャストはvoid*自動的に行われます。

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

この特別なケースでは、単純に次のようになります。

pv = const_cast<string*>( ps );

string*からへの変換void*は暗黙的です。明示的にしたい場合は、2 番目の別のキャストが必要になります。

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

また

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

ただし、明示する必要は特にないと思います。を使用しているという事実は、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 の方が優れている理由がわかりました。それでも、(私の意見では) void へのキャストの危険な部分がいくらか隠れてしまうので、私はそれが好きではありません。レビューでは、すべての reinterpret_casts を単純に検索して、潜在的に危険な場所をレビューするのは簡単です。

于 2012-10-23T10:15:57.383 に答える