可能重复:
C++ - Why static member function can’t be created with ‘const’ qualifier
很想知道静态成员函数不能声明为const或volatile或const volatile的原因吗?
#include<iostream>
class Test
{
static void fun() const
{ // compiler error
return;
}
};
答案 0 :(得分:14)
成员函数的cv修饰符对应于隐藏this
参数的限定。
static
个函数没有this
个参数。因此,他们不需要cv限定符。所以({恕我直言,正确地说,没有意义)决定在static
函数上禁止它们。
BTW static
成员函数也不能是virtual
,纯=0
},已删除,默认,&&
等。
答案 1 :(得分:10)
因为这就是标准所说的:
2)[注意:静态成员函数没有this指针(9.3.2)。 -end note]
static
成员 功能不应是virtual
。不应该有static
和非static
成员函数 相同的名称和相同的参数类型(13.1)。 不应声明静态成员函数const
,volatile
或const volatile
。 (强调我的)
原因是const
(或volatile
或virtual
)static
方法没有意义(传统意义上,见下文)。例如,const
意味着你无法修改对象的成员,但在静态的情况下,没有任何对象可以讨论。
你可以说const
static
可以适用于其他static
成员,但这个选项被视为没有意义。
答案 2 :(得分:1)
静态成员函数是不依赖于对象(即类实例)的全局自由函数。非静态成员函数上的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
}
答案 3 :(得分:1)
执行静态函数时没有“当前对象”,所以讨论静态函数是否为const
是没有意义的。
请注意,您可以使用实例调用static
函数,但这只是一个奇怪的C ++“特性”(有时候很方便,因为在C ++ 03中很难获得值的类型)。 / p>
struct Foo {
static void f();
};
void bar()
{
Foo foo_instance;
foo_instance.f(); // Exactly the same as Foo::f()
}
我可以理解你希望能够描述“const static functions”,它不会改变任何静态数据成员,也只能调用其他const静态函数。
但是C ++中没有这种区别。