Подтвердить что ты не робот

Почему нет концепции "const-correctness" для статических функций-членов класса?

Случай использования:

class A {
  static int s_common;
public:
  static int getCommon () const { s_common; };
};

Обычно это приводит к ошибке:

error: static member function 'static int A:: getCommon() не может иметь CV-классификатор

Это связано с тем, что const ness применяется только к объекту, на который указывает this, который отсутствует в функции-члене static.

Однако, если бы это было разрешено, функция члена static "const" могла быть легко связана с членами данных static.
Почему эта функция отсутствует в С++; любая логическая причина этого?

4b9b3361

Ответ 1

cv-qualifiers влияют на подпись функции. Таким образом, вы могли бы:

class A {
  static int s_common;
public:
  static void getCommon () const {  };
  static void getCommon () {  };
};

Теперь... как бы вы назвали const один? Нет объекта const для его вызова (ну, вы могли бы называть его объектом const, но это не точка).

Я просто угадываю здесь, возможно, есть и другие причины.:)

Ответ 2

Однако, если бы это было разрешено, статическая функция-член "const" могла быть легко связана со статическими элементами данных.

Здесь ваш вопрос запутывается. Нестатическая функция-член, объявленная как const, по-прежнему имеет доступ к статическим членам данных не const. const применяется только к this (т.е. К нестационарным элементам данных).

Было бы бессмысленно, чтобы статическая функция-член могла использовать const так же синтаксически, но иметь совершенно другой результат (т.е. сделать доступ к статическим членам данных const).

Кроме того, статические члены данных представляют собой не что иное, как глобальные переменные класса, в которых есть элементы управления доступом класса (public/private/etc). Поэтому для некоторых функций не имеет смысла иметь другой доступ к ним const, особенно на основе их подписи.

Ответ 3

Обоснование наличия const cv-квалификатора для функций-членов:
Чтобы указать, что скрытый указатель this передается функции-члену, неизменен и его нельзя изменить. Функция-член static не имеет скрытого параметра this, и, следовательно, функции const для static не имеют смысла.

Однако, если бы это было разрешено, статическая функция-член "const" могла быть легко связана со статическими элементами данных.

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

Ответ 4

Функция, которая не меняет никакого глобального состояния, является чистой. С++ 11 вводит атрибуты, которые могут включать [[pure]] на определенных платформах.

Одна проблема с const заключается в том, что она является частью типа функции. Присвоение функции static const указателю на "нормальную" функцию потребует специального правила преобразования, литья или распада. И, как упоминает Лучиан, это позволило бы полностью неоднозначную перегрузку.

По существу вы описываете формирование одноэлементного объекта из членов static, используя общий, квалифицированный путь косвенного доступа. Чтобы объект non-const отображался как const, к нему нужно получить доступ через что-то, но там нет this. Изменится ли его decltype? Хорошего ответа нет. Если вы хотите все это, тогда помещайте их явно внутри объекта class.

Ответ 5

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

Ответ 6

Хороший вопрос.

Я считаю, что концептуальная константа относится к четко определенному объекту или структуре данных. Не для глобальных/статических и т.д.

Точно так же я могу спросить, почему глобальная (или, альтернативно, специфичная для пространства имен) функция не может быть const, то есть она может обещать не изменять какие-либо глобальные (или специфичные для пространства имен) переменные.

Это не слишком много значит ИМХО. Но да, константа статических членов, принадлежащих к определенному классу, - это может быть полезно в некоторых случаях ИМХО.