機能があります
static bool Validate(const char& letter, string& aWord)
私はそれを呼び出す必要があります
Validate(letter, aWord); // where aWord is const
この場合、const_castの正しい方法は何ですか?
機能があります
static bool Validate(const char& letter, string& aWord)
私はそれを呼び出す必要があります
Validate(letter, aWord); // where aWord is const
この場合、const_castの正しい方法は何ですか?
関数が文字列を変更しないことが絶対に確実な場合は、次のようにすることができます。
Validate (letter, const_cast<std::string &>(aWord));
ただし、署名を仮想的にに変更できる場合は不要なコピーですが、より安全な方法はconst
、文字列をコピーしてそのコピーを渡すことです。
std::string copyOfAWord = aWord;
Validate (letter, copyOfAWord);
それが何かを変えるなら、あなたのコピーは代わりに結果を持っているでしょう、しかしそれはそもそもあなたの論理を壊します。
正しい方法はそれをキャストしないことです。
ここの署名
static bool Validate(const char& letter, string& aWord)
Validate()
パラメータを変更する可能性があると言っていますaWord
。したがって、変更されるconst値を渡すことは、未定義の動作です(変更された場合(最後の段落を参照))。
それが変化しないことが確実な場合は、それでも恒常性を捨てないでください。この場合、提供された保証を反映するように署名を変更してください。Validate()
aWord
aWord
constでないという事実は、それが変異する可能性があることを意味しaWord
ます。このバージョンでは変化しなくても、将来誰かがやって来てそれを変更する可能性があります。そうすると、プログラムがひどく壊れて、エラーを見つけることができなくなります。
あなたが恒常性を捨てているなら、あなたは何か間違ったことをしている。
ここでの唯一の解決策(インターフェースを変更できない場合)は、非コストバージョンを渡すことです。持っていないので、作成する必要があります。
std::string aWordTmpCopy(aWord);
Validate(letter, aWordTmpCopy);