0

機能があります

static bool Validate(const char& letter, string& aWord)

私はそれを呼び出す必要があります

Validate(letter, aWord); // where aWord is const

この場合、const_castの正しい方法は何ですか?

4

2 に答える 2

4

関数が文字列を変更しないことが絶対に確実な場合は、次のようにすることができます。

Validate (letter, const_cast<std::string &>(aWord));

ただし、署名を仮想的にに変更できる場合は不要なコピーですが、より安全な方法はconst、文字列をコピーしてそのコピーを渡すことです。

std::string copyOfAWord = aWord;
Validate (letter, copyOfAWord);

それが何かを変えるなら、あなたのコピーは代わりに結果を持っているでしょう、しかしそれはそもそもあなたの論理を壊します。

于 2012-06-03T02:36:20.647 に答える
3

正しい方法はそれをキャストしないことです。

ここの署名

static bool Validate(const char& letter, string& aWord)

Validate()パラメータを変更する可能性があると言っていますaWord。したがって、変更されるconst値を渡すことは、未定義の動作です(変更された場合(最後の段落を参照))。

それが変化しないことが確実な場合は、それでも恒常性を捨てないでください。この場合、提供された保証を反映するように署名を変更してください。Validate()aWord

aWordconstでないという事実は、それが変異する可能性があることを意味しaWordます。このバージョンでは変化しなくても、将来誰かがやって来てそれを変更する可能性があります。そうすると、プログラムがひどく壊れて、エラーを見つけることができなくなります。

あなたが恒常性を捨てているなら、あなたは何か間違ったことをしている。

ここでの唯一の解決策(インターフェースを変更できない場合)は、非コストバージョンを渡すことです。持っていないので、作成する必要があります。

std::string    aWordTmpCopy(aWord);
Validate(letter, aWordTmpCopy);
于 2012-06-03T02:44:04.640 に答える