ほとんどの場合、可能な限り変数をconstにするのは、意図を表現し誤用の可能性を減らすための良いものです。
しかし、引数を渡すときには警告があります。
void foo(const char* text);
void foo(const std::string& text);
しかしCONSTを作り、引数として実際のコピーを渡す際に多くの欠点を有する:
CONSTリソースへのポインタまたは参照を渡すことによって、賢明かつ正確です。考えてみましょう:
std::string sorted(const std::string source)
{
// I must copy source again because it's immutable
auto result = source; // redundant copy
std::sort(std::begin(result), std::end(result));
return result;
}
可変引数を渡す一方、機能がより効率的にそれを使用することができます:
std::string sorted(std::string source)
{
// lots of opportunity for copy elision and RVO here.
std::sort(std::begin(source), std::end(source));
return source;
}
をこれは良い形であるかどうかの特定の質問に対処するために:
void foo(const char* const text);
答えは適格な「いいえ」です:
2番目のconstは誰にも保証を提供しません。呼び出された関数は単にポインタtext
をコピーしてコピーを修正することができます。
APIを別の単語でクラッタし、値を追加しません。
が、2番目のconstは、発信者の利益のために存在しないことを反論はありますが、foo()
の実装のために。
この場合、誤って変更することなく使用できるconstデータへの安全なconstポインタが提供されます。
これに対するカウンターカウンターの引数は、インターフェイスを介したリーク実装の詳細です。
*彼らはvarに書き込もうとしません、彼らはちょうどそこから値を読み取る*その事実を知る簡単な方法は何でしょうか?シグネチャでconstを見つけるか、メソッド全体を解析して(そして、すべてのメソッドがそれを順番に渡して)書き込みを行いますか?また、書かれていないので、定数で安全に呼び出すことができます。 –
質問は逆の言い方をしています:データを読み込んだだけの場合はなぜ*読み取り専用タイプを使用しないのですか?あなたは実際に書くときに読み取り専用のタイプを使用することはできませんか? – Angew