0

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 を変更することを恐れています。

4

2 に答える 2

3

引数が const 参照である場合、それを変更しないことを「約束」しているため、fromを呼び出す必要さえありません。pass_by_non_constpass_by_const

型システムに違反したい場合(これは悪いことです)、次のような醜いことを行うことができます

 pass_by_const(const std::string& s)
 {
    pass_by_non_const(const_cast<std::string&>(s));
 }

しかし重要なのは、そうすることは間違っており、未定義の動作になる可能性があるということです。そのため、何か問題が発生する可能性があります (クラッシュ、またはプログラムが意図したことを誤って実行することさえあります)。

型システムに従い、不変条件に違反することを避けたい場合は、アンチトラストの回答で提案されているようにローカル コピーを作成してください。もちろん、ローカル コピーの作成にはコストがかかる場合があります。

于 2013-04-21T07:56:58.997 に答える
3

何が起こるか

pass_by_const(const std::string& s)
{
    pass_by_non_const(s);
}

is: pass_by_consthas const argumentstd::string sであるため、スコープを囲んで定義され、彼に引数として渡された文字列 s を変更することはできません。ただし、pass_by_non_consts を変更することは許可されています。これにより、コンパイル時にコンパイラ エラーが発生します。

ただし、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 に従います。

于 2013-04-21T07:46:54.110 に答える