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

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

В n3092 г. это устарело:

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

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

Единственная статья, которую я мог найти, является несколько неофициальной.

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

Кто-нибудь знает, почему это было изменено?

3 ответа

Решение

В стандартных отчетах о дефектах базового языка C++ и принятых проблемах, редакция 94 под 1012. Недостатком статического `они отмечают:

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

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

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

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

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

В n3092 г. это устарело:

Амортизация указывает на:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам