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


86

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


1
あなたにとって、const静的メンバー関数はどういう意味ですか?
GManNickG 2011

2
@GManつまり、入力を変更しない静的メンバー関数です。
プラバカラン2011

11
次に、入力(関数パラメーター)はvalueまたはconst-referencesによるものでなければなりません。
GManNickG 2011

3
とにかく、メンバー関数の引数の定数には影響しません。「すべてをconstにする」という意味ではなく、「このconstにする」という意味です。
UncleBens 2011

@GManは、constを引数に追加する必要があると言っていますか
prabhakaran 2011

回答:


137

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

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


'const'がint、pointerなどの変数専用であることを意味しますか?
プラバカラン2011

@ prabhakaran-メンバー関数もconst修飾できます。ジェームズは彼の答えの中でそれをはっきりと述べました。
マヘシュ2011

@Maheshメンバー関数のconst修飾子も、全体ではなく、「このポインター」のみを修飾します。const修飾メンバー関数内でグローバル変数を変更することはできます。今、私だけがこれをチェックしました。
プラバカラン2011

5
-1「静的メンバー関数にはthisポインターがありません...したがって、静的メンバー関数のconst修飾は[そのように]意味がありません」それ自体は真実ですが、質問の「なぜ」に対する答えとしては間違っています"。答えとして、const静的メンバーと非静的メンバーの意味は同じでなければならないと想定しています。その考え方が成り立たない例として、static文脈に依存するの意味を考えてみましょう。
乾杯とhth。-アルフ2014

2
それはありますC const*const C*
クリスロン2016年

24

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

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

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

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


8
おそらく、無料の関数をconst-modifyして、「この関数はグローバル変数を変更しない」という意味にできない理由と同じです。constオブジェクトに適用されます(constメンバー関数の場合、それが呼び出されるインスタンス)。クラスのすべての静的メンバーに適用したいのですが、委員会で検討されたとしても、サポートするのに十分な一般的な要件ではないと思われます。
スティーブジェソップ2011

1
const修飾子は、メンバメソッドまたはメンバー変数が、暗黙的に適用されていないthis-pointer。静的メンバーメソッドはオブジェクトにバインドされていないため、this作成するポインターはありませんconst
Ruud Althuizen 2017年

1

詳細に立ち入ることなく、関数によって変更されたオブジェクトがある場合とない場合があるため、constはコンパイラーにとってあいまいです。

constオブジェクトを一定に保つことを思い出してください。ただし、一定に保つためのオブジェクトがここにある場合とない場合があります。


2
「かもしれないし、しないかもしれない」?静的メンバー関数にポインターが含まれることはありませんthis。(それに加えて、constオブジェクトを一定に保ちません。特定のポインターまたは参照を使用してオブジェクトを変更することはできませんが、変更は別のパスを介して行われる可能性があります)
Ben Voigt 2015

1

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

1

'constメンバー関数'は、呼び出されたオブジェクトを変更することはできませんが、静的メンバー関数はどのオブジェクトでも呼び出されません。スコープ解決演算子によって直接使用されます。したがって、const静的メンバー関数を持つことは意味がないため、違法です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.