В C ++ можно использовать static
ключевое слово в единице перевода, чтобы повлиять на видимость символа (объявление переменной или функции).
В n3092 это устарело:
Приложение D.2 [depr.static]
Использование ключевого слова static не рекомендуется при объявлении объектов в области пространства имен (см. 3.3.6).
В n3225 это было удалено.
Единственная статья , я мог бы найти несколько неформальной.
Тем не менее, он подчеркивает, что для совместимости с C (и возможности компилировать C-программы как C ++) устаревание раздражает. Однако компиляция программы C непосредственно как C ++ уже может быть неприятным занятием, поэтому я не уверен, заслуживает ли это рассмотрения.
Кто-нибудь знает, почему его поменяли?
Ответы:
В отчетах о дефектах и принятых проблемах стандартного основного языка C ++, редакция 94 до 1012. Не рекомендуется использовать static `, они отмечают:
По сути, говоря, что отказ от поддержки
static
не имеет смысла. Он никогда не будет удален из C ++ и по-прежнему полезен, потому что вам не нужен шаблонный код с безымянными пространствами имен, если вы просто хотите объявить функцию или объект с внутренней связью.источник
static class ...
, OTOH, работать не будет.namespace {
" и "}
"?Я постараюсь ответить на ваш вопрос, хотя это старый вопрос, и он не выглядит очень важным (действительно, не очень важным сам по себе ), и на него уже есть неплохие ответы. Причина, по которой я хочу ответить на этот вопрос, заключается в том, что это относится к фундаментальным вопросам стандартной эволюции и проектирования языка, когда язык основан на существующем языке: когда функции языка должны быть устаревшими, удалены или изменены несовместимыми способами?
Фактически связь.
Устарение указывает на:
Последний момент важен. Хотя никогда не бывает формального обещания, что ваша программа не будет нарушена, иногда молча, в соответствии со следующим стандартом, комитет должен стараться избегать нарушения «разумного» кода. Устарение должно указывать программистам, что неразумно полагаться на какую-либо функцию .
Очень важно сохранить общее подмножество C / C ++, особенно для файлов заголовков. Конечно,
static
глобальные объявления - это объявления символа с внутренней связью, и это не очень полезно в файле заголовка.Но проблема заключается не только в совместимости с C, а в совместимости с существующим C ++: существует множество действующих программ C ++, которые используют
static
глобальные объявления. Этот код не только формально легален, он надежен, поскольку использует четко определенные языковые функции в том виде, в котором он предназначен для использования .Тот факт, что теперь существует «лучший способ» (по мнению некоторых) что-то сделать, не делает программы, написанные старым способом, «плохими» или «неразумными». Возможность использования
static
ключевого слова в объявлениях объектов и функций в глобальной области видимости хорошо понимается в сообществах C и C ++ и чаще всего используется правильно.Точно так же я не собираюсь менять приведение C-стиля
double
наstatic_cast<double>
просто потому, что «приведение C-стиля плохое», так какstatic_cast<double>
добавляет нулевую информацию и нулевую безопасность.Идея о том, что всякий раз, когда изобретается новый способ сделать что-либо, все программисты спешат переписать свой существующий четко определенный рабочий код, просто безумна. Если вы хотите удалить все унаследованные C уродства и проблемы, вы не меняете C ++, вы изобретаете новый язык программирования. Половина удаления одного использования
static
вряд ли сделает C ++ менее C-уродливым.Изменения кода требуют обоснования, и «старое - плохо» никогда не является оправданием для изменений кода.
Прекращение языковых изменений требует очень веского обоснования. Слегка упрощение языка никогда не является оправданием серьезного изменения.
Приведенные причины, почему
static
это плохо, просто удивительно слабы, и даже неясно, почему не объявляются устаревшими одновременно и объекты, и объявления функций - разное обращение с ними вряд ли сделает C ++ более простым или более ортогональным.Так что, действительно, это печальная история. Не из-за практических последствий: у него было ровно ноль практических последствий. Но потому, что это показывает явное отсутствие здравого смысла со стороны комитета ISO.
источник
static
или анонимные пространства имен, я также не поощряю и не обескураживаю. Я хочу сказать, что если вы действительно хотите отговорить людей использовать анонимные пространства имен, вы должны дать им хороший аргумент. На практике я считаю, что в большинстве реализаций сущности, объявленные в безымянном пространстве имен, представляют собой символы, экспортируемые со случайным именем, таким образом увеличивая таблицу экспорта. Сущности, объявленные какstatic
OTOH, никак не экспортируются. Таким образом, многие люди, основываясь на этом наблюдении, выбирают использованиеstatic
.static
хочу сказать, что область видимости пространства имен никогда не исчезнет, поэтому не рекомендуется ее исключать. « Тем не менее, вы не утверждаете, что препятствовать его использованию - неправильно». Я не видел убедительных аргументов, показывающих, что использование namespace-scopestatic
«неправильно». Исключить его использование только для того, чтобы препятствовать его использованию, неправильно, потому что никто на самом деле не верит, что он исчезнет, и потому что он не убеждает людей в том, что его использование «неправильно».Устарело или нет, удаление этой языковой функции приведет к нарушению существующих кодов и раздражению людей.
Вся эта статическая устаревшая идея была просто принятием желаемого за действительное в духе «анонимные пространства имен лучше, чем статические» и «ссылки - лучшие указатели». Лол.
источник
char* foo = new char; char& ref = *foo;
То, что вам дан указатель, изначально ничего не говорит о вашей способности использовать ссылки.