pass_by_const(const std::string& s)
を呼び出したいこの関数がありますpass_by_non_const(std::string& s)
。
このメソッドの定義があれば
pass_by_const(const std::string& s)
{
pass_by_non_const(s);
}
コンパイラは私に譲歩しますか?回避策はありますか? pass_by_non_const
私はそれが私の後ろの s を変更することを恐れています。
pass_by_const(const std::string& s)
を呼び出したいこの関数がありますpass_by_non_const(std::string& s)
。
このメソッドの定義があれば
pass_by_const(const std::string& s)
{
pass_by_non_const(s);
}
コンパイラは私に譲歩しますか?回避策はありますか? pass_by_non_const
私はそれが私の後ろの s を変更することを恐れています。
引数が const 参照である場合、それを変更しないことを「約束」しているため、fromを呼び出す必要さえありません。pass_by_non_const
pass_by_const
型システムに違反したい場合(これは悪いことです)、次のような醜いことを行うことができます
pass_by_const(const std::string& s)
{
pass_by_non_const(const_cast<std::string&>(s));
}
しかし重要なのは、そうすることは間違っており、未定義の動作になる可能性があるということです。そのため、何か問題が発生する可能性があります (クラッシュ、またはプログラムが意図したことを誤って実行することさえあります)。
型システムに従い、不変条件に違反することを避けたい場合は、アンチトラストの回答で提案されているようにローカル コピーを作成してください。もちろん、ローカル コピーの作成にはコストがかかる場合があります。
何が起こるか
pass_by_const(const std::string& s)
{
pass_by_non_const(s);
}
is: pass_by_const
has const argumentstd::string s
であるため、スコープを囲んで定義され、彼に引数として渡された文字列 s を変更することはできません。ただし、pass_by_non_const
s を変更することは許可されています。これにより、コンパイル時にコンパイラ エラーが発生します。
ただし、s のローカルの非 const コピーを渡すことができますpass_by_non_const
。次に、ローカル コピーは のスコープで変更できますがpass_by_non_const
、引数として に渡された外側のスコープのpass_by_const
は変更されません。
メソッドを書く正しい方法は、
pass_by_const(const std::string& s)
{
std::string local_copy = s;
pass_by_non_const(local_copy );
}
コンパイル時のエラーはなくなりました。 local_copy はほとんどの内部スコープで変更できますが、外側のスコープからの s は変更されず、pass_by_const
メソッドの pass-by-const-ref-ness に従います。