免責事項: 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 つだけ見てきました。
#include <iostream>
struct Vector2 {
int X;
int Y;
};
void display(/* const */ Vector2& vect) {
std::cout << vect.X << " " << vect.Y << std::endl;
}
int main() {
display(Vector2());
}
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