重複の可能性:
C++-静的メンバー関数を「const」修飾子で作成できない理由
静的メンバー関数をconstまたはvolatileまたはconstvolatileとして宣言できない理由を知りたいと思いましたか?
#include<iostream>
class Test
{
static void fun() const
{ // compiler error
return;
}
};
重複の可能性:
C++-静的メンバー関数を「const」修飾子で作成できない理由
静的メンバー関数をconstまたはvolatileまたはconstvolatileとして宣言できない理由を知りたいと思いましたか?
#include<iostream>
class Test
{
static void fun() const
{ // compiler error
return;
}
};
this
メンバー関数のcv-modifiersは、非表示パラメーターの修飾に対応します。
static
関数にはthis
パラメーターがありません。したがって、cv-qualifiersは必要ありません。そのため、関数でそれらを禁止することが決定されました(IMHOは当然、そうでなければ意味がありません)static
。
ところで、メンバー関数は、純粋()、削除、デフォルトなどにstatic
することもできません。virtual
=0
&&
それが標準が言っていることだからです:
2)[注:静的メンバー関数にはthisポインター(9.3.2)がありません。—endnote]
static
メンバー関数は。であってはなりませんvirtual
。同じ名前と同じパラメータタイプ(13.1)static
の非メンバー関数があってはなりません。静的メンバー関数は、、、、またはで宣言してはなりません 。(強調鉱山)static
const
volatile
const volatile
この理由は、const
(またはvolatile
またはvirtual
)static
メソッドが意味をなさないためです(従来の意味では、以下を参照してください)。たとえばconst
、オブジェクトのメンバーを変更できないことを意味しますが、静力学の場合、話すオブジェクトはありません。
const
static
他のメンバーにも適用できると主張することもできますstatic
が、このオプションは無意味と見なされていました。
静的メンバー関数は、オブジェクト(つまり、クラスインスタンス)に依存しないグローバルで自由な関数です。非静的メンバー関数のCV修飾子は、それらが呼び出されるオブジェクトのタイプを参照します。この概念は、静的メンバー関数には適用されません。
例:
struct Foo
{
void f(); // Overload #1
void f() const; // Overload #2
static void g();
};
int main()
{
Foo x;
x.f(); // calls overload #1
static_cast<Foo const &>(x).f(); // calls overload #2
Foo::g(); // does not know about any instance!
x.g(); // same as Foo::g(); "x" is a red herring
}
静的関数を実行するときは「現在のオブジェクト」がないため、静的関数が存在するconst
かどうかについて説明することはほとんど意味がありません。
インスタンスを使用して関数を呼び出すことができますがstatic
、これは奇妙なC ++の「機能」であることに注意してください(C ++ 03では値の型を取得するのが難しいため、便利な場合があります)。
struct Foo {
static void f();
};
void bar()
{
Foo foo_instance;
foo_instance.f(); // Exactly the same as Foo::f()
}
静的データメンバーを変更せず、他のconst静的関数のみを呼び出すことができる「const静的関数」を記述できるようにしたいとのことです。
ただし、この区別はC++にはありません。