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


86

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


1
Что constдля вас означает статическая функция-член?
GManNickG

2
@GMan Я имею в виду статическую функцию-член, которая никогда не меняет свои входы.
прабхакаран

11
Тогда ваши входы (параметры функции) должны быть по значению или константным ссылкам.
GManNickG

3
В любом случае это не влияет на постоянство аргументов функций-членов. Это не означает «сделать все константным», это означает «сделать это константным».
UncleBens

@GMan, вы говорите, что к аргументам нужно добавить const?
прабхакаран,

Ответы:


137

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

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


Означает ли это, что 'const' предназначена только для таких переменных, как int, указатель и т. Д.?
прабхакаран

@prabhakaran - Функции - члены могут быть Const квалифицированы тоже. Джеймс ясно упомянул об этом в своем ответе.
Махеш

Квалификатор const функции @Mahesh также квалифицирует только 'этот указатель', а не целиком. Вы по-прежнему можете изменить глобальную переменную в функции-члене с квалификацией const. Сейчас только это проверил.
прабхакаран

5
-1 «Статическая функция-член не имеет указателя this ... поэтому квалификация const статической функции-члена не имеет никакого смысла [в этом смысле]» истинна сама по себе, но неверна как ответ на вопрос «почему ". В качестве ответа предполагается, что значение constдля статического члена должно быть таким же, как и для нестатического. В качестве примера того, что такое мышление не работает, рассмотрим значение static, которое зависит от контекста.
Приветствия и hth. - Alf

2
Это C const*или const C*?
crisron

24

Я согласен с вашим вопросом, но, к сожалению, 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членов от любых изменений.

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


8
Вероятно, по той же причине, что вы не можете изменить свободную функцию константой, чтобы она означала, что «эта функция не изменяет никаких глобальных переменных». constприменяется к объекту (в случае константных функций-членов - к экземпляру, для которого он вызван). Вы хотите, чтобы это применялось ко всем статическим членам класса, я бы предположил, что если бы он вообще рассматривался комитетом, то это не считалось достаточно общим требованием для поддержки.
Стив Джессоп,

1
constМодификатор не применяется к методам членов или переменным членов, но с неявным this-указателем. Поскольку статический метод-член не привязан к объекту, thisдля создания указателя не требуется const.
Рууд Альтуизен

1

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

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


2
"может или не может"? Статическая функция-член никогда не имеет thisуказателя. (Кроме того, constне сохраняет объекты постоянными. Это предотвращает использование определенного указателя или ссылки для изменения объекта, но модификация все равно может происходить по другому пути)
Бен Войт

1

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

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

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

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.