11

使用事例:

class A {
  static int s_common;
public:
  static int getCommon () const { s_common; };
};

通常、これは次のようなエラーになります。

エラー: 静的メンバー関数 'static int A::getCommon()' には cv-qualifier を指定できません

これは、メンバー関数には存在しない がconst指すオブジェクトにのみ ness が適用されるためです。thisstatic

ただし、許可されていれば、staticメンバー関数の「const」性をstaticデータ メンバーに簡単に関連付けることができたはずです。
この機能が C++ にないのはなぜですか。その背後にある論理的な理由は何ですか?

4

6 に答える 6

8

cv-qualifiers関数のシグネチャに影響します。したがって、次のことができます。

class A {
  static int s_common;
public:
  static void getCommon () const {  };
  static void getCommon () {  };
};

さて...あなたはそれをどのように呼びますconstか?それを呼び出すオブジェクトはありませんconst(オブジェクトで呼び出すこともできますが、それconstは重要ではありません)。

あくまでも推測ですが、他にも理由があるのか​​もしれません。:)

于 2012-04-11T06:07:08.880 に答える
8

ただし、それが許可されていれば、静的メンバー関数の「const」性を静的データ メンバーに簡単に関連付けることができたはずです。

これがあなたの質問が混乱するところです。として宣言された非静的メンバー関数は、静的データ メンバーにconstまだconstアクセスできません。のみに適用されます(つまり、非静的データ メンバー)。constthis

静的メンバー関数がconst構文的に同じように使用しても、まったく異なる結果になる (つまり、静的データ メンバーにアクセスするconst) ことは意味がありません。

さらに、静的データ メンバーは、クラス アクセス制御 (public/private/etc) を持つクラス スコープのグローバル変数にすぎません。constそのため、特に署名に基づいて、一部の関数が異なるアクセス権を持つことは意味がありません。

于 2012-04-11T06:14:43.583 に答える
5

constメンバー関数に cv-qualifier を使用する理由は次のとおりです。メンバー関数に渡される
隠しポインターが不変であり、変更できないことを示すため。thisメンバー関数にstaticは隠しthisパラメーターがないためconststaticメンバー関数には意味がありません。

ただし、それが許可されていれば、静的メンバー関数の「const」性を静的データ メンバーに簡単に関連付けることができたはずです。

これは、最初から修飾子を持つ理由ではありませんでしたconst。これは、フリー関数に cv 修飾子を適用できないという事実から明らかです。wascv-qualifiersと are はthis、関数が呼び出されているオブジェクトのみを対象としています。

于 2012-04-11T06:06:25.630 に答える
2

グローバル状態を変更しない関数は純粋です。C++11 では[[pure]]、特定のプラットフォームに含まれる可能性がある属性が導入されています。

1 つの問題は、それが関数のconstの一部であることです。その関数を「通常の」関数ポインターに割り当てるには、特別な変換、キャスト、または減衰規則が必要になります。Luchian が言及しているように、完全にあいまいなオーバーロードが可能になります。static const

基本的に、メンバーからシングルトン オブジェクトを形成しstatic、共通の限定された間接アクセス パスを共有することを説明しています。非 const オブジェクトが const に見えるようにするには、何かを介してアクセスする必要がありますが、this. それはdecltype変わるでしょうか?良い答えはありません。これらすべてが必要な場合は、それらを明示的にclassオブジェクト内に配置します。

于 2012-04-11T06:19:37.777 に答える
1

私の推測では、メンバー関数staticで andを使用しconstて静的メンバー変数の constness を参照することは、単にオプションとは見なされませんでした。IMOあなたの提案は、これら2つのキーワードを混合する奇妙な(しかしおそらく賢明な)方法です。

于 2012-04-11T06:05:12.853 に答える
1

良い質問。

概念的には、const-ness は明確に定義されたオブジェクトまたはデータ構造に適用されると思います。グローバル/静的などではありません。

グローバル(または名前空間固有)関数がなぜそうでないのかconst、つまり、グローバル(または名前空間固有)変数を変更しないことを約束する可能性があるのと同じように。

これはあまり意味がありません。しかし、はい、特定のクラスに属する静的メンバーの const-ness - これは場合によっては役立つかもしれません。

于 2012-04-11T06:09:30.237 に答える