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


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

4 66

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 beyond this указатель.
т. е. "предложенный"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