C ++:为什么不能将静态函数声明为const或volatile或const volatile

时间:2012-10-21 12:52:06

标签: c++

  

可能重复:
  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;
   }
};

4 个答案:

答案 0 :(得分:14)

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

static个函数没有this个参数。因此,他们不需要cv限定符。所以({恕我直言,正确地说,没有意义)决定在static函数上禁止它们。

BTW static成员函数也不能是virtual,纯=0},已删除,默认,&&等。

答案 1 :(得分:10)

因为这就是标准所说的:

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

  

2)[注意:静态成员函数没有this指针(9.3.2)。 -end note] static成员   功能不应是virtual。不应该有static和非static成员函数   相同的名称和相同的参数类型(13.1)。 不应声明静态成员函数const,   volatileconst volatile 。 (强调我的)

原因是const(或volatilevirtualstatic方法没有意义(传统意义上,见下文)。例如,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 ++中没有这种区别。