9

可能重复:
C++ - 为什么不能使用“const”限定符创建静态成员函数

很想知道静态成员函数不能声明为 const 或 volatile 或 const volatile 的原因吗?

#include<iostream>

class Test 
{     
   static void fun() const 
   { // compiler error
       return;
   }
};
4

4 回答 4

14

成员函数的 cv 修饰符对应于隐藏this参数的限定。

static函数没有this参数。因此,它们不需要 cv 限定符。所以决定(恕我直言,正确,否则,它没有任何意义)在static函数中禁止它们。

BTWstatic成员函数也不能是virtual,pure( =0),deleted,defaulted&&等。

于 2012-10-21T12:54:17.227 回答
11

因为这就是标准所说的:

9.4.1 静态成员函数 [class.static.mfct]

2) [ 注意:静态成员函数没有 this 指针 (9.3.2)。—尾注]static成员函数不应该是virtual。不应存在​​具有相同名称和相同参数类型(13.1)static的非成员函数。静态成员函数不得声明为。(强调我的)staticconstvolatileconst volatile

这样做的原因是const(或volatilevirtualstatic方法没有意义(在传统意义上,见下文)。例如,const意味着您不能修改对象的成员,但在静态的情况下,没有可谈的对象。

你可以争辩说 aconst static可以适用于其他static成员,但这个选项被认为是没有意义的。

于 2012-10-21T12:56:11.460 回答
1

执行静态函数时没有“当前对象”,因此讨论静态函数的存在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++ 中不存在。

于 2012-10-21T13:11:01.923 回答
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
}
于 2012-10-21T13:02:25.313 回答