很想知道静态成员函数不能声明为 const 或 volatile 或 const volatile 的原因吗?
#include<iostream>
class Test
{
static void fun() const
{ // compiler error
return;
}
};
很想知道静态成员函数不能声明为 const 或 volatile 或 const volatile 的原因吗?
#include<iostream>
class Test
{
static void fun() const
{ // compiler error
return;
}
};
成员函数的 cv 修饰符对应于隐藏this
参数的限定。
static
函数没有this
参数。因此,它们不需要 cv 限定符。所以决定(恕我直言,正确,否则,它没有任何意义)在static
函数中禁止它们。
BTWstatic
成员函数也不能是virtual
,pure( =0
),deleted,defaulted&&
等。
因为这就是标准所说的:
2) [ 注意:静态成员函数没有 this 指针 (9.3.2)。—尾注]
static
成员函数不应该是virtual
。不应存在具有相同名称和相同参数类型(13.1)static
的非成员函数。静态成员函数不得声明为、 或。(强调我的)static
const
volatile
const volatile
这样做的原因是const
(或volatile
或virtual
)static
方法没有意义(在传统意义上,见下文)。例如,const
意味着您不能修改对象的成员,但在静态的情况下,没有可谈的对象。
你可以争辩说 aconst
static
可以适用于其他static
成员,但这个选项被认为是没有意义的。
执行静态函数时没有“当前对象”,因此讨论静态函数的存在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++ 中不存在。
静态成员函数是不依赖于对象(即类实例)的全局、自由函数。非静态成员函数上的 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
}