/ /静的メンバー関数にcv修飾子を指定できないのはなぜですか? -c ++、visual-c ++、static、const

静的メンバー関数にcv修飾子を付けることができないのはなぜですか? - c ++、visual-c ++、static、const

これはエラーです:

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;
}

回答:

回答№1の33

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

9.4.1静的メンバー関数

2)[注:静的メンバー関数にはthisポインターがありません(9.3.2)。 —注を終了] A static メンバー 機能は virtual。あってはならない static および非static を持つメンバー関数 同じ名前と同じパラメータータイプ(13.1)。

静的メンバー関数は宣言されません const, volatile、または const volatile.

static 機能はありません this パラメータ。 cv修飾子は必要ありません。

見る この ジェームズ・マクネリスによる回答

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


回答№2の10

A static メンバー関数はそのクラスのインスタンスにバインドされていないため、それが意味をなさない const および/または volatile (つまり、「cv-qualified」)。これは、 const または volatile その関数を呼び出す際に適用できます。


回答№3の場合は3

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


回答№4の場合は1

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


回答№5の場合は1

メンバー関数の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