Подтвердить что ты не робот

Почему статическая функция-член не может иметь cv-квалификатор?

Это ошибка:

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;
}
4b9b3361

Ответ 1

Стоит процитировать стандарт здесь

9.4.1 Функции статических членов

2) [Примечание. Статическая функция-член не имеет этого указателя (9.3.2). -end note] A static участник функция не должна быть virtual. Не должно быть функции static и не static с одно и то же имя и те же типы параметров (13.1).

Статическая функция-член не должна быть объявлена ​​ const, volatile или const volatile.

static функции не имеют параметра this. Они не нуждаются в cv-квалификаторах.

См. этот ответ Джеймса Макнеллиса

Когда вы применяете квалификатор const к нестатической функции-члену, он влияет на указатель this. Для константной функции члена класса C, указатель this имеет тип C const*, тогда как для a функция-член, которая не является константной, указатель this имеет тип C*.

Ответ 2

A static функция-член не привязана к экземпляру своего класса, поэтому для нее не имеет смысла быть const и/или volatile (т.е. "cv-qualified" ), потому что существует нет экземпляра, к которому могут применяться const или volatile при вызове этой функции.

Ответ 3

Нет смысла писать const там, потому что функция static и, следовательно, не существует экземпляра класса, для которого нужно вставить контекст const. Таким образом, он рассматривается как ошибка.

Ответ 4

Ключ-константа в объявлении функции-члена применяется к указателю на объект класса this. Поскольку статические функции не привязаны к объектам класса, у них нет неявного параметра. Поэтому спецификатор const не имеет никакого смысла для этих функций.

Ответ 5

Определитель констант для функций-членов означает, что функция не будет изменять экземпляр объекта и может быть вызвана в объектах 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