Просто потому, что вам дают указатель, изначально ничего не говорит о вашей способности использовать ссылки.

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

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

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

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

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

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

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

 Crazy Eddie18 янв. 2011 г., 18:10
хех, спасибо, нашел, где его достать. Пытался удалить комментарий, но вы меня там избили.
 Etienne de Martel18 янв. 2011 г., 17:44
Вы объявляете объекты в области имен пространства в C?
 Fred Nurk18 янв. 2011 г., 18:28
Вопрос возник изstackoverflow.com/questions/4725204/...
 James McNellis10 февр. 2011 г., 23:48
Это также дает Комитету C ++ возможность что-то недооценивать в следующей версии Стандарта :-)
 Martin Ba04 июл. 2013 г., 14:07

Ответы на вопрос(3)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 Lightness Races in Orbit17 янв. 2013 г., 19:24
Весь язык "исчезнет когда-нибудь". Давайте осудим C ++.
 Nicol Bolas10 дек. 2011 г., 23:22
Как вы сами указываете, смысл в том, чтобы не одобрять его, это препятствовать его использованию. Тем не менее, вы не утверждаете, что препятствовать его использованию неправильно. Я, конечно, надеюсь, что никто не поощряет людей использовать статические объявления в пространстве имен над анонимными пространствами имен. Нет, если они специально не нуждаются в кросс-компиляции C.
 curiousguy12 дек. 2011 г., 00:57
"Как вы сами указываете, смысл в том, чтобы не одобрять его, это препятствовать его использованию.«Смысл противодействия его использованию в том, что он может исчезнуть когда-нибудь. Моя точка зрения заключается в том, что пространство именstatic никогда не исчезнет, ​​так что это не рекомендуется. "Тем не менее, вы не утверждаете, что препятствовать его использованию неправильно.«Я не видел ни одного убедительного аргумента, который показывает, что использование namespace-scopestatic неправильно". Устаревать его просто так, чтобы препятствовать его использованию, неправильно, потому что никто на самом деле не верит, что оно исчезнет, ​​и потому что оно не убеждает людей в том, что его использование "неправильно".
 curiousguy12 дек. 2011 г., 00:49
Меня не волнует, что люди используют глобальные возможностиstatic или анонимные пространства имен, я тоже не поощряю и не обескураживаю. Я хочу сказать, что если вы действительно хотите отговорить людей использовать анонимные пространства имен, вы должны дать им хороший аргумент. На практике я полагаю, что в большинстве реализаций сущности, объявленные в безымянном пространстве имен, являются символами, экспортируемыми со случайным именем, таким образом увеличивая таблицу экспорта. Объекты, объявленные какstatic, OTOH, никак не экспортируются. Таким образом, многие люди выбирают, основываясь на этом наблюдении, использоватьstatic.
 curiousguy12 дек. 2011 г., 01:05
"Я, конечно, надеюсь, что никто не поощряет людей использовать статические объявления в пространстве имен над анонимными пространствами имен.«Некоторые люди думают, чтоstatic лучше, и поощряйте его использование над анонимными пространствами имен. Моя точка зрения не в том, что один из них лучше другого; моя точка зрения 1), что нет функции (static, а не пространства имен) "неправильно". 2) что отрицать полезную, четко определенную, широко используемую функцию, которая никогда не пойдет по пути - никогда - неправильно. Это снижает доверие к комитету C ++ (и оно уже довольно низкое).
Решение Вопроса

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

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

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

 Neil Butterworth26 апр. 2011 г., 21:41
@Sbi Почему это было бы хорошо?
 Sebastian Mach04 июл. 2011 г., 15:48
@nbt: потому что вы не можете использовать статические символы в качестве аргументов шаблона и потому, что многие новички сочтут, что статические проще в использовании, а затем не пробуют попробовать <функционал> и <алгоритм> и др. Просто быстрая мысль.
 towi25 февр. 2014 г., 09:24
«потому что вам не нужен шаблонный код, который вам нужен с безымянными пространствами имен»? Какой «шаблонный код»? Нечто за "namespace {" а также "}«?
 sbi23 февр. 2011 г., 17:04
Что ж, кажется, что устарелость побудит людей вместо этого использовать безымянные пространства имен, что было бы хорошо.
 sbi27 апр. 2011 г., 08:57
@unaperson: Если ни по какой другой причине, то потому что безымянные пространства имен предоставляют тот же механизм для создания переменных, констант, функций и типов, внутренних для их TU.static class ...ОТО, не сработает.

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

Вся вещь, связанная со статическим устареванием, заключалась в том, чтобы думать просто как «анонимные пространства имен лучше, чем статические», а «ссылки - лучшие указатели». Лол.

 Lightness Races in Orbit04 февр. 2012 г., 03:54
@DanBreslau:char* foo = new char; char& ref = *foo; Просто потому, что вам дают указатель, изначально ничего не говорит о вашей способности использовать ссылки.
 Fred Nurk18 янв. 2011 г., 18:26
@Dan: Это именно то, что говорит этот ответ: «желаемое за действительное» по аналогичной ошибочной линии мышления. Неназванные пространства имен являются важной особенностью, так же как и global-scope-static, хотя и по несколько иным причинам, и хотя они имеют некоторое совпадение в применимости.
 Dan Breslau18 янв. 2011 г., 18:06
«Ссылки лучше указатели»? Нет, умные указатели умнее указателей. Вы не можете использовать ссылки для памяти, выделенной из кучи, ошибки, свободного хранилища.
 Maxim Egorushkin18 янв. 2011 г., 18:09
Извините, я забыл покончить с этим ироничным смайликом.
 Dan Breslau19 янв. 2011 г., 02:09
@Fred, @Maxim: Извините, если я неправильно понял, или если моя память неисправна. Но я не классифицирую «ссылки - лучшие указатели» как эквивалент «анонимных пространств имен лучше, чем статические» как случай желаемого мышления. Мне хорошо известна попытка сделать последнюю палку, но я не помню, чтобы кто-нибудь серьезно предлагал заменить указатели ссылками. Опять же, может быть, мне не хватает моего осознания.

Ваш ответ на вопрос