いいえ、規格では直接禁止されています。
ISO 14882:2003C++標準13.1/2 –オーバーロード可能な宣言
特定の関数宣言はオーバーロードできません。
- 戻り型のみが異なる関数宣言は、オーバーロードできません。
- 同じ名前で同じパラメーター型のメンバー関数宣言は、それらのいずれかが
static
メンバー関数宣言(9.4)である場合、オーバーロードできません。
..。
[例:
class X {
static void f();
void f(); // ill-formed
void f() const; // ill-formed
void f() const volatile; // ill-formed
void g();
void g() const; // OK: no static g
void g() const volatile; // OK: no static g
};
-例を終了]
..。
さらに、インスタンスで静的関数を呼び出すことができるため、とにかくあいまいになります。
ISO 14882:2003C++標準9.4/2 –静的メンバー
s
クラスの静的メンバーは、 qualified-id
式X
を使用して参照できます。を参照するためにクラスメンバーアクセス構文(5.2.5)を使用する必要はありません。メンバーは、クラスメンバーアクセス構文を使用して参照できます。
その場合、は評価されます。[例:X::s
static member
static
object-expression
class process {
public:
static void reschedule();
}
process& g();
void f()
{
process::reschedule(); // OK: no object necessary
g().reschedule(); // g() is called
}
-例を終了]
..。
したがって、あなたが持っているものにはあいまいさがあります:
class Foo
{
public:
string bla;
Foo() { bla = "nonstatic"; }
void print() { cout << bla << endl; }
static void print() { cout << "static" << endl; }
};
int main()
{
Foo f;
// Call the static or non-static member function?
// C++ standard 9.4/2 says that static member
// functions are callable via this syntax. But
// since there's also a non-static function named
// "print()", it is ambiguous.
f.print();
}
メンバー関数が呼び出されているインスタンスを確認できるかどうかについての質問に答えるために、this
キーワードがあります。キーワードはthis
、関数が呼び出されたオブジェクトを指します。ただし、this
キーワードは常にオブジェクトを指します。つまり、オブジェクトは決してなりませんNULL
。したがって、関数が静的に呼び出されているかどうか、またはPHPで呼び出されていないかどうかを確認することはできません。
ISO 14882:2003C++標準9.3.2/1 –このポインタ
非静的(9.3)メンバー関数の本体では、キーワードthis
は非左辺値式であり、その値は関数が呼び出されるオブジェクトのアドレスです。