C++ - почему статическая функция-член не может быть создана с помощью квалификатора " const

сегодня у меня проблемы. Я нуждаюсь в static функции-члена, const Не обязательно, но лучше. Но мои усилия не увенчались успехом. Кто-нибудь может сказать, почему или как?

4 ответов


при использовании const квалификатор к нестатической функции-члену, он влияет на this указатель. Для const-квалифицированной функции-члена класса C на this указатель типа C const*, тогда как для функции-члена, которая не является 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 дальше this указатель.
то есть" предлагаемое"const, который также может применяться к static функции, ограничат static участники из любой модификации.

в примере кода if 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