Зняття статичного ключового слова ... не більше?


89

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

У n3092 це було припинено:

Додаток D.2 [depr.static]
Використання ключового слова static застаріло під час оголошення об’єктів у області простору імен (див. 3.3.6).

У n3225 це було вилучено.

Єдина стаття , я міг би знайти кілька неформальною.

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

Хтось знає, чому його змінили?


3
Ви оголошуєте об'єкти в області простору імен у C?
Етьєн де Мартель

хе, thx, знайшов де взяти це. Спробував видалити коментар, але ви мене там побили.
Едвард Стрендж

Питання виникло у stackoverflow.com/questions/4725204/…
Fred Nurk

1
Це також дає Комітету C ++ можливість зняти зі звинувачення щось у наступній версії Стандарту :-)
Джеймс МакНелліс,

Відповіді:


75

У стандартних звітах про дефекти основної мови С ++ та прийнятих питаннях, редакція 94 під 1012. Скасовуючи статичні `вони відзначають:

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

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


2
Ну, схоже, застаріння спонукало б людей використовувати замість них імена без імен, що було б добре.
sbi

1
@unaperson: Якщо з жодної іншої причини, то тому, що неіменовані простори імен забезпечують той самий механізм створення змінних, констант, функцій та типів, внутрішніх до їх TU. static class ... , OTOH, не буде працювати.
sbi

2
@nbt: Оскільки ви не можете використовувати статичні символи як аргументи шаблону і тому, що багатьом новачкам статика стане простішою у використанні, а потім не намагаються спробувати <functional> та <algorithm> та ін. Лише швидка думка.
Себастьян Мах,

2
"тому що вам не потрібен шаблонний код, який вам потрібен з неіменованими просторами імен"? Що таке "шаблонний код"? Щось поза " namespace {" та " }"?
towi

1
@ErikAronesty Якщо у вас є "локальний клас" в іншому файлі з такою ж назвою, тоді ви допустите порушення ODR.
LF

32

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

У C ++ можна використовувати статичне ключове слово в одиниці перекладу, щоб впливати на видимість символу (або змінної, або оголошення функції).

Посилання насправді.

У 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, ви не змінюєте C ++, ви винаходите нову мову програмування. Видалення наполовину одного використання staticнавряд чи робить C ++ менш потворним.

Зміни коду потребують обґрунтування, а "старе - це погано" ніколи не є виправданням змін коду.

Порушення мовних змін потребує дуже вагомого обґрунтування. Спрощення мови дещо спрощеніше ніколи не є виправданням непереборних змін.

Наведені причини, чому staticце погано, просто надзвичайно слабкі, і навіть незрозуміло, чому і об'єкти, і оголошення оголошень не застаріли разом - надання їм різної обробки навряд чи робить C ++ простішим або більш ортогональним.

Тож насправді це сумна історія. Не через практичні наслідки, які це мало: це мало рівно нульові практичні наслідки. Але оскільки це свідчить про явну відсутність здорового глузду з боку комітету ISO.


5
Як ви самі зазначаєте, сенс знецінення полягає в тому, щоб перешкоджати його використанню. Тим не менше, ти не аргументуєш, що перешкоджати його використанню є неправильним. Я, звичайно, сподіваюся, що ніхто не заохочує людей використовувати статичні декларації з простором імен над анонімними просторами імен.
Тим не менше,

2
Мені не так важливі люди, які використовують глобальний обсяг staticчи анонімні простори імен, я теж не заохочую і не знеохочую. Моя думка полягає в тому, що якщо ви дійсно хочете відмовити людям використовувати анонімні простори імен, ви повинні дати їм вагомі аргументи. На практиці я вважаю, що в більшості реалізацій сутності, оголошені в неіменованому просторі імен, є символами, експортованими з випадковим ім'ям, таким чином зростаючи таблиця експорту. Суб'єкти, декларовані як staticOTOH, жодним чином не експортуються. Таким чином, на основі цього спостереження багато людей обирають використання static.
curiousguy

2
« Як ви самі зазначаєте, сенс знецінення полягає в тому, щоб перешкоджати його використанню ». Сенс перешкоджати його використанню полягає в тому, що він може зникнути колись. Я маю на увазі, що область простору імен staticніколи не зникне, тому неправильно припиняти її існування. " Тим не менш, ти не наводиш аргументів, що перешкоджати його використанню є неправильним. " Я не бачив жодного переконливого аргументу, який би доводив, що використання простору імен static"є неправильним". Знецінювати його, лише щоб перешкодити його вживанню, неправильно, оскільки насправді ніхто не вірить, що воно зникне, і тому, що це не переконує людей, що його використання є «неправильним».
curiousguy

5
Вся мова "колись зникне". Давайте знехтуємо C ++.
Гонки легкості на орбіті

2
"Подібним чином, я не збираюся змінювати зливки в стилі C на подвійні на static_cast <double> просто тому, що" зливки в стилі C погані ", оскільки static_cast <double> додає нульову інформацію та нульову безпеку." Моя вічна сутичка з багатьма інженерами-програмістами, які постійно скаржаться на те, що я вільно використовую кастинг у стилі C від одного примітива до іншого.
Макогон,

14

Заборонено чи ні, видалення цієї мовної функції призведе до порушення існуючих кодів та досади людям.

Вся статична застаріла річ полягала лише у бажанні думок у напрямку "анонімні простори імен кращі, ніж статичні" та "посилання - кращі вказівники". Лол.


1
"Посилання є кращими вказівниками"? Ні, розумні вказівники - це розумніші вказівники. Ви не можете використовувати посилання на пам’ять, виділену з купи, помилково, вільного сховища.
Dan Breslau

3
Вибачте, я забув закінчити це іронічним смайликом.
Максим Єгорушкін

2
@Dan: Саме про це йдеться у цій відповіді: "бажане мислення" за подібною помилковою лінією думок. Неіменовані простори імен є важливою особливістю, так само, як і глобальна сфера-статична, хоча з дещо інших причин, і хоча вони мають певне перекриття в застосовності.
Fred Nurk

@Fred, @Maxim: Вибачте, якщо я неправильно зрозумів, або якщо моя пам'ять несправна. Але я не класифікую "посилання є кращими вказівниками" як еквівалентні "анонімним просторам імен краще, ніж статичним" як випадок бажаного. Мені добре відома спроба зробити останню палицю, але я не пам’ятаю, щоб хтось робив серйозну пропозицію замінити покажчики посиланнями. Знову ж таки, можливо, бракує мого власного усвідомлення.
Dan Breslau

1
@DanBreslau: char* foo = new char; char& ref = *foo; Просто тому, що вам дають покажчик, спочатку нічого не сказано про вашу здатність використовувати посилання.
Гонки легкості на орбіті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.