Почему статическая функция-член не может иметь 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;
}
Ответы
Ответ 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