【问题标题】:Why can't a static member function have a cv-qualifier?为什么静态成员函数不能有 cv 限定符?
【发布时间】:2013-11-17 17:33:36
【问题描述】:

这是错误:

error: static member function ‘static void myClass::myfunct()’ cannot have cv-qualifier

谁能解释一下这个错误以及为什么不能使用 const。

#include<iostream>
class myClass{      
   static void myfunct() const 
   { 
     //do something
   }
};

int main()
{
   //some code
   return 0;
}

【问题讨论】:

  • 你想用const这个词做什么?
  • 静态函数上的常量可用于防止静态函数改变类的状态。那为什么错误还是标准呢?
  • 您似乎正在改变您的问题。首先你问“这是什么意思?”现在你在问“为什么它的意思不是我想要的意思?”关于为什么以某种方式设计语言的问题并不适合这个网站,因为它们不实用。 (无论语言是按照您喜欢的方式设计的,都不会改变您必须针对您拥有的语言进行编程这一事实,而不是您希望拥有的语言。)无论如何,在链接中对基本原理进行了一些讨论重复。

标签: c++ visual-c++ static constants


【解决方案1】:

值得在这里引用标准

9.4.1 静态成员函数

2) [ 注意:静态成员函数没有 this 指针 (9.3.2)。 —尾注] static 成员 函数不应为virtual。不应有static 和非static 成员函数与 相同的名称和相同的参数类型 (13.1)。

不得声明静态成员函数constvolatile,或const volatile

static 函数没有 this 参数。它们不需要 cv 限定符。

查看this James McNellis 的回答

当您将const 限定符应用于非静态成员函数时, 它会影响this 指针。对于 const 限定的成员函数 C 类的,this 指针的类型为 C const*,而对于 非 const 限定的成员函数,this 指针是 输入C*

【讨论】:

  • 引用标准是唯一正确的回应。其他答案表明“没有意义”是一个原因。您可以(我不会)争辩说静态成员上的 const 会阻止静态函数改变类的状态(即静态成员变量),因此可能是有道理的,它只是标准委员会做出的选择不是它会起作用的。
  • @LokiAstari 当应用于函数时,这将改变const 的含义。制作函数const的意思是将this的类型从T*改为T const*。这个含义显然只能适用于非静态成员,这就是委员会选择它所做的事情的原因。否则,您必须更改函数上 const 的定义。
  • @LokiAstari 该标准通常不会告诉您为什么。引用标准通常只会告诉您您已经知道的内容。在这种情况下,您可以推断得更多,因为只提到了this 指针,但这远不能解释任何事情。
  • @JamesKanze:我理解他们这样做的原因和原因。但是当他们建立标准时,他们可以很容易地以另一种方式争论并为班级成员应用一条特殊规则。就我个人而言,我很高兴他们没有(简单而干净的最好),但它基本上归结为仲裁员的选择(双方都有可用的论据)。所以你唯一的选择就是引用标准。
  • +1 还有,多么棒的名字——al-Khwārizmī,我以前不知道应该怎么写成英文。
【解决方案2】:

static 成员函数未绑定到其类的实例,因此它是 const 和/或 volatile(即“cv-qualified”)没有意义,因为有在调用该函数时,没有可以应用 constvolatile 的实例。

【讨论】:

    【解决方案3】:

    在那里写const 没有意义,因为函数是static,因此没有可以在其上注入const 上下文的类实例。因此它被视为错误。

    【讨论】:

      【解决方案4】:

      成员函数声明中的限定符 const 应用于指向类 this 对象的指针。由于静态函数不绑定到类的对象,它们没有隐式参数 this。所以限定符 const 对这些函数没有任何意义。

      【讨论】:

        【解决方案5】:

        成员函数的 const 限定符意味着该函数不会改变对象实例,并且可以在 const 对象上调用。静态成员函数未绑定到任何对象实例,因此将它们设为 const 毫无意义,因为您不会在任何对象上调用静态成员函数。这就是标准禁止它的原因。

        class Foo
        {
        public:
            void memberFunc();
            static void staticMemberFunc();
        }
        
        Foo f;
        f.memberFunc();          // called on an object instance
        Foo::staticMemberFunc(); // not called on an object instance
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-04
          • 2023-03-06
          • 2011-01-18
          • 2020-11-30
          • 1970-01-01
          • 2020-01-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多