Сегодня у меня проблема. Я нуждаюсь в функции-члене static
, const
не обязательно, но лучше. Но мне не удалось в моих усилиях. Может ли кто-нибудь сказать, почему и как?
С++ - почему статическая функция-член не может быть создана с помощью квалификатора '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
"Константной функции-члену" не разрешено изменять объект, для которого она вызывается, но статические функции-члены не вызываются ни для одного объекта. Используется непосредственно оператором разрешения области видимости. Таким образом, иметь постоянную статическую функцию-член не имеет смысла, следовательно, это незаконно.