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. В каком-то смысле она узкая. Это может быть сделано шире, применяя этоconstbeyondthisуказатель.
т. е. "предложенный"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