C++ - почему статическая функция-член не может быть создана с помощью квалификатора 'const'
сегодня у меня проблемы. Я нуждаюсь в static
функции-члена, const
это не обязательно, но лучше. Но, я не преуспел в своих усилиях. Кто-нибудь может сказать, почему и как?
4 ответа:
при использовании
const
квалификатор к нестатической функции-члену, он влияет наthis
указатель. Для const-квалифицированной функции-члена классаC
наthis
указатель типаC const*
, тогда как для функции-члена, которая не является константной,this
указатель типаC*
.статическая функция-член не имеет
this
указатель (такая функция не вызывается на конкретном экземпляре класса), поэтому const квалификация статического функция-член не имеет никакого смысла.
Я согласен с вашим вопросом, но, к сожалению, C++ разработан именно так. Например:
class A { int i; //<--- accessed with 'this' static int s; //<---- accessed without 'this' public: static void foo () const // <-- imaginary const {} };
на сегодняшний день
const
рассматривается в контекстеthis
. В каком-то смысле она узкая. Это может быть сделано шире, применяя этоconst
beyondthis
указатель.
т. е. "предложенный"const
, что также может относиться кstatic
функции, ограничатstatic
участники из любой модификации.в примере кода, если
foo()
можно сделатьconst
, то в этой функции,A::s
не может быть изменен. Я не вижу никаких побочных эффектов языка, если это правило добавлено к стандарту. Наоборот, удивительно, почему такого правила не существует!
Не вдаваясь в подробности, это потому, что может быть или не быть объект, измененный функцией, поэтому const неоднозначен для компилятора.
Напомним, что
const
сохраняет объекты постоянными, но здесь может быть или не быть объекта, который будет постоянным.
жаль, что C++ не принимает его в соответствии с дизайном, но логически есть несколько случаев использования, в которых он хорошо проверяет.
функция, которая является допустимым уровнем класса (статическим), может не изменять никаких статических данных, может быть, это просто данные запроса должны быть const. Может быть, это должно быть как
if(Object) MakeThisConstant() else MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios