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

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

Ответ 1

Когда вы применяете квалификатор const к нестатической функции-члену, он влияет на указатель this. Для константной функции-члена класса C указатель this имеет тип C const*, тогда как для функции-члена, которая не является константной, указатель this имеет тип C*.

Статическая функция-член не имеет указателя this (такая функция не вызывается в конкретном экземпляре класса), поэтому const-критерий статической функции-члена не имеет никакого смысла.

Ответ 2

Я согласен с вашим вопросом, но, к сожалению, С++ разработан именно так. Например:

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 от любой модификации.

В примере кода, если foo() можно сделать const, то в этой функции A::s не может быть изменен. Я не вижу никаких языковых побочных эффектов, если это правило добавляется к стандарту. Напротив, забавно, почему такое правило не существует!

Ответ 3

Не вдаваясь в детали, это потому, что объект может быть или не может быть изменен функцией, поэтому const является неоднозначным для компилятора.

Вспомним, что const сохраняет объекты постоянными, но здесь может быть или не быть объект, чтобы поддерживать константу.

Ответ 4

К сожалению, С++ не принимает его в соответствии с дизайном, но логически существует мало случаев, когда он хорошо проверяет.

Функция, которая является допустимым классом (статическим), может не изменять какие-либо статические данные, может быть, она будет просто запрашивать данные, которые должны быть const. Может быть, это должно быть как

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios

Ответ 5

"Константной функции-члену" не разрешено изменять объект, для которого она вызывается, но статические функции-члены не вызываются ни для одного объекта. Используется непосредственно оператором разрешения области видимости. Таким образом, иметь постоянную статическую функцию-член не имеет смысла, следовательно, это незаконно.