Устаревание ключевого слова static ... больше нет?


В C++ можно использовать static ключевое слово в единице перевода, влияющее на видимость символа (объявление переменной или функции).

в n3092 это было устаревшим:

Приложение D. 2 [depr.статика]
Использование ключевого слова static не рекомендуется при объявлении объектов в области пространства имен (см. 3.3.6).

в n3225, это было удалено.

на только статья I мог бы найти несколько неофициальных.

однако он подчеркивает, что для совместимости с C (и возможности компиляции C-программ как C++) устаревание раздражает. Однако компиляция программы C непосредственно как C++ может быть уже разочаровывающим опытом, поэтому я не уверен, что это заслуживает рассмотрения.

кто-нибудь знает почему его сменили ?

3 78

3 ответа:

In Стандартные отчеты о дефектах языка ядра C++ и принятые проблемы, редакция 94 под 1012. Undeprecating static они заметьте:

хотя 7.3.1.1 [пространство имен.unnamed] указывает, что использование ключевого слова static для объявления переменных в области пространства имен является устаревшим, поскольку Безымянное пространство имен предоставляет превосходную альтернативу, маловероятно, что функция будет удалена в любой момент в обозримом будущем будущее.

в основном говорят, что устаревании static на самом деле не имеет смысла. Он никогда не будет удален из C++, и он по-прежнему полезен, потому что вам не нужен шаблонный код, который вам нужен с безымянными пространствами имен, если вы просто хотите объявить функцию или объект с внутренней связью.

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

в C++ можно использовать ключевое слово static в единице перевода, чтобы повлиять на видимость символа (объявление переменной или функции).

связь на самом деле.

в n3092 это было устаревшим:

осуждение указывает:

  • The намерение удалить некоторые функции в будущем; это не означает, что устаревший функции будут удалены в следующей стандартной редакции, или что они должны быть удалены "скоро", или вообще. И не устаревшие функции могут быть удалены в следующей стандартной редакции.
  • формальная попытка не поощряйте его использование.

последний момент важен. Хотя никогда не существует официального обещания, что ваша программа не будет нарушена, иногда молча, по следующему стандарту, комитет должен стараться избегать нарушения "разумного" кода. Устаревание должно сказать программистам, что неразумно зависеть от какой-то особенности.

однако он подчеркивает, что для совместимости с C (и возможности компиляции C-программ как C++) устаревание раздражает. Однако компиляция программы C непосредственно как C++ может быть уже разочаровывающим опытом, поэтому я не уверен, что это заслуживает рассмотрения.

очень важно сохранить общее подмножество C / C++, особенно для заголовочный файл. Конечно,static глобальные объявления-это объявления символа с внутренней связью, и это не очень полезно в заголовочном файле.

но проблема не только в совместимости с C, это совместимость с существующим C++: есть тонны существующих допустимых программ C++, которые используют static глобальные объявления. Этот кодекс не просто формально легален, он звучит, как он использует четко определенную языковую функцию так, как она должна быть используется.

просто потому, что теперь есть "лучший способ" (по мнению некоторых) сделать что-то, не делает программы, написанные старым способом, "плохими" или "неразумными". Возможность использования static ключевое слово для объявлений объектов и функций в глобальной области хорошо понимается как в сообществах C, так и в C++ и чаще всего используется правильно.

в аналогичном ключе, я не собираюсь менять C-style casts на double до static_cast<double> просто потому, что "Си-стиль приведения плохо", как static_cast<double> добавляет нулевую информацию и нулевую безопасность.

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

изменения кода требуют обоснования, и "старое плохо" никогда не является оправданием для изменений кода.

нарушение языковых изменений требует очень сильного обоснования. Создание языка очень немного проще никогда не является оправданием для резкого изменения.

причины, по которым static плохо просто удивительно слабы, и даже не ясно, почему оба объекта и объявления функций не являются устаревшими вместе - давая им различное лечение вряд ли делает C++ проще или больше ортогональный.

так что, действительно, это печальная история. Не из-за практических последствий, которые она имела: она имела ровно нулевые практические последствия. Но потому что это показывает явное отсутствие здравого смысла у комитета ИСО.

устарело или нет, удаление этой языковой функции нарушило бы существующие коды и раздражало людей.

вся статическая устаревшая вещь была просто желаемой мыслью по строкам "анонимные пространства имен лучше, чем статические" и "ссылки-лучшие указатели". Лол.