今日、問題が発生しました。私はstatic
メンバー関数が必要です。const
は必須ではなく、より優れています。しかし、私は努力に成功しませんでした。誰が理由または方法を言うことができますか?
const
修飾子を非静的メンバー関数に適用すると、this
ポインターに影響します。クラスC
のconst修飾メンバー関数の場合、this
ポインターはC const*
型です。一方、const修飾されていないメンバー関数の場合、this
ポインターはC*
型です。
静的メンバー関数にはthis
ポインターがありません(そのような関数はクラスの特定のインスタンスで呼び出されません)。そのため、静的メンバー関数のconst修飾は意味がありません。
私はあなたの質問に同意しますが、残念ながらC++はそのように設計されています。例えば:
_class A {
int i; //<--- accessed with 'this'
static int s; //<---- accessed without 'this'
public:
static void foo () const // <-- imaginary const
{}
};
_
現在、const
はthis
のコンテキストで考慮されています。ある意味では、それは狭いです。 const
ポインターを超えてこのthis
を適用することにより、より広くすることができます。
i.e 「提案された」const
は、static
関数にも適用される可能性があり、static
メンバーの変更を制限します。
サンプルコードでは、foo()
をconst
にできる場合、その関数では_A::s
_を変更できません。このルールが標準に追加されている場合、言語の副作用は見られません。それどころか、なぜそのようなルールが存在しないのかおもしろいです!
C++が設計どおりにC++を受け入れないのは残念ですが、論理的には十分に検証されるユースケースはほとんどありません。
クラスレベルのvalid(static)である関数は、静的データを変更しない場合があります。単にクエリデータをconstにする必要がある場合があります。かもしれない
if(Object)
MakeThisConstant()
else
MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
詳細を説明しなくても、関数によって変更されたオブジェクトがある場合とない場合があるため、constはコンパイラにとって曖昧です。
const
はオブジェクトを一定に保つことを思い出してください。しかし、一定に保つためのオブジェクトがここにあるかもしれないし、ないかもしれません。