web-dev-qa-db-ja.com

C ++-静的メンバー関数を「const」修飾子で作成できない理由

今日、問題が発生しました。私はstaticメンバー関数が必要です。constは必須ではなく、より優れています。しかし、私は努力に成功しませんでした。誰が理由または方法を言うことができますか?

76
prabhakaran

const修飾子を非静的メンバー関数に適用すると、thisポインターに影響します。クラスCのc​​onst修飾メンバー関数の場合、thisポインターはC const*型です。一方、const修飾されていないメンバー関数の場合、thisポインターはC*型です。

静的メンバー関数にはthisポインターがありません(そのような関数はクラスの特定のインスタンスで呼び出されません)。そのため、静的メンバー関数のconst修飾は意味がありません。

122
James McNellis

私はあなたの質問に同意しますが、残念ながらC++はそのように設計されています。例えば:

_class A {
  int i;         //<--- accessed with 'this'
  static int s;  //<---- accessed without 'this'
public:
  static void foo ()  const // <-- imaginary const
  {}
};
_

現在、constthisのコンテキストで考慮されています。ある意味では、それは狭いです。 constポインターを超えてこのthisを適用することにより、より広くすることができます。
i.e 「提案された」constは、static関数にも適用される可能性があり、staticメンバーの変更を制限します。

サンプルコードでは、foo()constにできる場合、その関数では_A::s_を変更できません。このルールが標準に追加されている場合、言語の副作用は見られません。それどころか、なぜそのようなルールが存在しないのかおもしろいです!

21
iammilind

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
0

詳細を説明しなくても、関数によって変更されたオブジェクトがある場合とない場合があるため、constはコンパイラにとって曖昧です。

constはオブジェクトを一定に保つことを思い出してください。しかし、一定に保つためのオブジェクトがここにあるかもしれないし、ないかもしれません。

0
Don Larynx