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

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

Ответы [ 5 ]

118 голосов
/ 12 августа 2011

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

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

20 голосов
/ 12 августа 2011

Я согласен с вашим вопросом, но, к сожалению, 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 не может быть изменено.Я не вижу никаких языковых побочных эффектов, если это правило добавлено в стандарт.Наоборот, забавно, почему такого правила не существует!

0 голосов
/ 28 мая 2019

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

0 голосов
/ 11 июня 2016

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

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

if(Object)
    MakeThisConstant()
else
    MakeStaticDataConstant() // Only in the scope but static data cannot be constant so may be it should in some scenarios
0 голосов
/ 05 апреля 2015

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...