web-dev-qa-db-ja.com

静的メンバー関数にcv-qualifierを使用できないのはなぜですか?

これはエラーです:

error: static member function ‘static void myClass::myfunct()’ cannot have cv-qualifier

誰かがこのエラーとconstを使用できない理由を説明できますか?.

#include<iostream>
class myClass{      
   static void myfunct() const 
   { 
     //do something
   }
};

int main()
{
   //some code
   return 0;
}
32
Sahil Sareen

ここで標準を引用する価値がある

9.4.1静的メンバー関数

2)[注:静的メンバー関数にはthisポインターがありません(9.3.2)。 —end note] staticメンバー関数はvirtualであってはなりません。 staticと非staticのメンバー関数は、同じ名前で同じパラメーター型(13.1)にしてはなりません。

静的メンバー関数は、constvolatile、またはconst volatileとして宣言されません。

static関数にはthisパラメータがありません。 cv-qualifiersは必要ありません。

this を参照してくださいJames McNellisによる回答

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

36
Sadique

staticメンバー関数はそのクラスのインスタンスにバインドされていないため、constvolatile(つまり「cv修飾」)であっても意味がありません")、その関数の呼び出しでconstまたはvolatileを適用できるインスタンスがないため。

12
juanchopanza

関数がconstであり、したがってstaticコンテキストを組み込むクラスインスタンスがないため、そこにconstを書き込むのは意味がありません。したがって、エラーとして扱われます。

メンバー関数のconst修飾子は、関数がオブジェクトインスタンスを変更せず、constオブジェクトで呼び出すことができることを意味します。静的メンバー関数はオブジェクトインスタンスにバインドされていないため、どのオブジェクトでも静的メンバー関数を呼び出さないため、それらがconstであっても意味がありません。それが規格がそれを禁じている理由です。

class Foo
{
public:
    void memberFunc();
    static void staticMemberFunc();
}

Foo f;
f.memberFunc();          // called on an object instance
Foo::staticMemberFunc(); // not called on an object instance
1
rozina

メンバー関数宣言の修飾子constは、クラスthisのオブジェクトへのポインターに適用されます。静的関数はクラスのオブジェクトにバインドされていないため、暗黙的なパラメーターthisはありません。したがって、修飾子constはこれらの関数には意味がありません。

1