これはエラーです:
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;
}
ここで標準を引用する価値がある
9.4.1静的メンバー関数
2)[注:静的メンバー関数にはthisポインターがありません(9.3.2)。 —end note]
static
メンバー関数はvirtual
であってはなりません。static
と非static
のメンバー関数は、同じ名前で同じパラメーター型(13.1)にしてはなりません。静的メンバー関数は、
const
、volatile
、またはconst volatile
として宣言されません。
static
関数にはthis
パラメータがありません。 cv-qualifiersは必要ありません。
this を参照してくださいJames McNellisによる回答
const
修飾子を非静的メンバー関数に適用すると、this
ポインターに影響します。クラスC
のconst修飾メンバー関数の場合、this
ポインターはC const*
型ですが、const修飾されていないメンバー関数の場合、this
ポインターのタイプはC*
です。
static
メンバー関数はそのクラスのインスタンスにバインドされていないため、const
やvolatile
(つまり「cv修飾」)であっても意味がありません")、その関数の呼び出しでconst
またはvolatile
を適用できるインスタンスがないため。
関数が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
メンバー関数宣言の修飾子constは、クラスthisのオブジェクトへのポインターに適用されます。静的関数はクラスのオブジェクトにバインドされていないため、暗黙的なパラメーターthisはありません。したがって、修飾子constはこれらの関数には意味がありません。