Вопрос по c++ – Почему не существует понятия «правильности констант» для статических функций-членов класса?

11

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

<code>class A {
  static int s_common;
public:
  static int getCommon () const { s_common; };
};
</code>

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

error: static member function ‘static int A::getCommon()’ cannot have cv-qualifier

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

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

@keety,that question связано и не дублирует, я видел это и проголосовал за это.this Аргумент указатель, который я упомянул в своем вопросе, и он не кажется достаточным. iammilind
круто, но, может быть, лучше, если вы поставите ссылку на исходную ветку в вопросе, чтобы получить контекст, или вы не возражаете, чтобы получить те же ответы keety

Ваш Ответ

6   ответов
2

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

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

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

Error: User Rate Limit Exceededwiki link for C++11Error: User Rate Limit Exceeded iammilind
8

s "const"ness could have been easily related to the static data members.

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

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

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

1

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

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

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

7

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

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededstatic constError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
5

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

However had it been allowed, the static member function's "const"ness could have been easily related to the static data members.

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

Error: User Rate Limit ExceededconstError: User Rate Limit ExceededhasError: User Rate Limit ExceededdisallowedError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

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

Похожие вопросы