問題タブ [const-correctness]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
6 に答える
22412 参照

c - C で 'char**' を 'const char* const*' に変換できないのはなぜですか?

次のコード スニペットは (正しく) C で警告を出し、C++ でエラーを出します (それぞれ gcc と g++ を使用し、バージョン 3.4.5 と 4.2.1 でテストされています; MSVC は気にしないようです):

私はこれを理解し、受け入れることができます。この問題に対する C++ の解決策は、b を const char * const * に変更することです。これにより、ポインターの再割り当てが禁止され、const-correctness ( C++ FAQ
) を回避できなくなります。

ただし、純粋な C では、(const char * const * を使用して) 修正されたバージョンでも警告が表示され、その理由がわかりません。キャストを使わずにこれを回避する方法はありますか?

明確にするために:
1)なぜこれはCで警告を生成するのですか?これは完全に const セーフである必要があり、C++ コンパイラはそれをそのように認識しているようです。
2) この char** をパラメーターとして受け入れ、それが指す文字を変更しないと言いながら (そしてコンパイラーに強制させる) 正しい方法は何ですか? たとえば、関数を書きたい場合:

そして、char** でそれを呼び出したかったのですが、パラメーターの正しい型は何でしょうか?

0 投票する
7 に答える
16504 参照

c# - C#の「定数の正確さ」

const-correctnessのポイントは、ユーザーが変更または削除できないインスタンスのビューを提供できるようにすることです。コンパイラーは、const関数内からconstnessを解除するとき、またはconstオブジェクトの非const関数を使用しようとするときに指摘することにより、これをサポートします。では、constアプローチをコピーせずに、同じ目的を持つC#で使用できる方法論はありますか?

私は不変性を認識していますが、それは実際には名前を付けるコンテナオブジェクトには引き継がれませんが、1つの例です。

0 投票する
2 に答える
4369 参照

c# - C#でconst-correctnessを達成するには?

重複の可能性:
C# の「const correctness」

私は長年 C++ をプログラミングしてきましたが、C# についてはまったくの初心者です。C# を学習しているときに、constキーワードの使用が C++ よりもはるかに制限されていることがわかりました。私の知る限り、たとえば、関数 const に引数を宣言する方法はありません。テストによってのみ検出できる関数の引数 (複雑なデータ構造である可能性があります) に不注意な変更を加える可能性があるという考えに不快感を覚えます。

この状況にどのように対処しますか?

0 投票する
16 に答える
29533 参照

c++ - constの正しさで私を売ってください

では、なぜconstをできるだけ頻繁に使用することが常に推奨されているのでしょうか。constを使用することは、C++でのヘルプよりも苦痛になる可能性があるように思われます。しかし、繰り返しになりますが、私はPythonの観点からこれに取り組んでいます。何かを変更したくない場合は、変更しないでください。そうは言っても、ここにいくつかの質問があります:

  1. 何かをconstとしてマークするたびに、エラーが発生し、constになるように他の関数をどこかで変更する必要があるようです。次に、これにより、別の関数を別の場所で変更する必要があります。これは経験を積むだけで簡単になるものですか?

  2. constを使用する利点は、問題を補うのに本当に十分ですか?オブジェクトを変更するつもりがないのなら、それを変更しないコードを書いてみませんか?

現時点では、正確性と保守性の目的でconstを使用することの利点に最も焦点を当てていますが、パフォーマンスへの影響についても理解しておくと便利です。

0 投票する
6 に答える
991 参照

c++ - オブザーバー パターンの const-correct Notifier

Model を変更しない Model クラスの Observer を実装したいと考えています。したがって、const-Reference を使用してモデルにアクセスできる必要があります。しかし、オブザーバーの登録はこれを禁止しています。

私のプロジェクトでオブザーバーパターンを実装する方法は次のとおりです。

非変更オブザーバーがモデルを「変更」する必要がある唯一の場所は、モデルに登録する場合です。ここで const_cast を避けることはできないと感じていますが、より良い解決策があるかどうかを知りたいと思っていました。

補足:別の言い方をすれば、モデル オブジェクトが管理する「オブザーバーのリスト」がモデルの状態の一部であるとは考えていません。C++ は違いを見分けることができず、状態とオブザーバーをまとめて、両方を const または非 const に強制します。

乾杯、フェリックス

0 投票する
3 に答える
2056 参照

c++ - STL コンテナの const ポインタ

C++ プログラマーの皆さん、こんにちは。STL コンテナーについて簡単な質問があります。

このステートメントは、(適切なインクルードを使用して) 一部の C++ ソースファイルで使用すると正常にコンパイルされます。しかし

また

gcc (gcc バージョン 4.0.1 (Apple Inc. ビルド 5484)) を使用するとコンパイルに失敗します。ただし、Visual Studio 2008 C++ コンパイラを使用すると、苦情は発生しません。

ちょっとした調査で、STL コンテナー内の要素はAssignable. VC 実装に STL バグがありますか (私は「ありそうにない」と言います)、それとも別の概念を使用していますAssignableか?

0 投票する
11 に答える
1831 参照

c++ - constメソッドから非constメソッドを生成するにはどうすればよいですか?

const-correctnessを目指して努力していると、私はしばしばこのようなコードを書いていることに気づきます。

のような多くのメソッドの場合bar()。constメソッドを手動で呼び出すこれらのnon-constメソッドを作成するのは面倒です。その上、私は自分自身を繰り返しているように感じます–それは私を気分が悪くさせます。

このタスクを軽減するために何ができますか?(マクロおよびコードジェネレーターは許可されていません。)

編集:litbのソリューションに加えて、私も自分のソリューションが好きです。:)

0 投票する
14 に答える
8561 参照

c++ - const-correctness が C++ に固有なのはなぜですか?

免責事項: const-correctness の有用性について 2 つの質問があることは承知していますが、他のプログラミング言語とは対照的に、C++ で const-correctness がどのように必要であるかについては誰も議論していません。また、これらの質問に対する回答に満足していません。

これまでにいくつかのプログラミング言語を使用してきましたが、C++ で気になる点の 1 つは、const-correctness の概念です。Java、C#、Python、Ruby、Visual Basic などにはそのような概念はありません。これは C++ に非常に固有のもののようです。

あなたが私に C++ FAQ Lite を紹介してくれる前に、私はそれを読みましたが、納得できません。完全に有効で信頼性の高いプログラムは常に Python で作成されており、const キーワードやそれに相当するものはありません。Java および C# では、オブジェクトを final (または const) と宣言できますが、const メンバー関数または const 関数パラメーターはありません。関数がオブジェクトを変更する必要がない場合は、オブジェクトへの読み取りアクセスのみを提供するインターフェイスを使用できます。この手法は、C++ でも同様に使用できます。私が取り組んだ 2 つの実際の C++ システムでは、どこでも const がほとんど使用されておらず、すべて正常に機能していました。したがって、const でコードベースを汚染することの有用性については、私は納得していません。

他のプログラミング言語とは対照的に、C++ で const が必要になるのは何でしょうか。

これまでのところ、const を使用する必要があるケースは 1 つだけ見てきました。

const をコメントアウトしてこれをコンパイルすると、Visual Studio で受け入れられますが、警告C4239が表示され、非標準の拡張機能が使用されます。したがって、一時的に渡し、コピーを避け、標準に準拠したままにするという構文の簡潔さが必要な場合は、const 参照で渡す必要があります。それでも、これは根本的な理由というよりは癖のようなものです。

それ以外の場合、const を使用する他のコードとインターフェイスする場合を除いて、const を使用する必要がある状況は実際にはありません。const は、私には、それが触れるすべてのものに広がる独善的な疫病に他なりません。

const が C++ で機能する理由は、それをキャストできるからです。それを捨てることができなければ、あなたの世界はつまらなくなるでしょう。const Bla を取るメソッドを宣言する場合、非 const Bla を渡すことができます。でも逆なら仕方ない。非 const Bla を取るメソッドを宣言する場合、const Bla を渡すことはできません。だから今、あなたは立ち往生しています。そのため、const ではないすべてのものの const バージョンが徐々に必要になり、最終的には影の世界になります。C++ では、このチェックが必要かどうかは純粋にオプションであるため、C++ では問題ありません。気に入らない場合は、constness を叩くことができます。

Anders Hejlsberg (C# アーキテクト)、CLR Design Choices