W C ++ możliwe jest użycie static
słowa kluczowego w jednostce translacyjnej, aby wpłynąć na widoczność symbolu (deklaracja zmiennej lub funkcji).
W n3092 to zostało wycofane:
Załącznik D.2 [depr.static]
Używanie słowa kluczowego static jest przestarzałe podczas deklarowania obiektów w zakresie przestrzeni nazw (patrz 3.3.6).
W n3225 zostało to usunięte.
Tylko artykuł udało mi się znaleźć to nieco nieformalny.
Podkreśla jednak, że ze względu na zgodność z C (i możliwość kompilowania programów w C jako C ++) wycofanie się jest denerwujące. Jednak kompilowanie programu w języku C bezpośrednio jako C ++ może już być frustrujące, więc nie jestem pewien, czy wymaga to rozważenia.
Czy ktoś wie, dlaczego został zmieniony?
Odpowiedzi:
W C ++ Standard Core Language Defect Reports and Accepted Issues, Revision 94 under 1012. Undeprecating static `` zauważają:
Zasadniczo mówienie, że wycofanie się z użycia
static
nie ma sensu. Nigdy nie zostanie usunięty z C ++ i nadal jest przydatny, ponieważ nie potrzebujesz standardowego kodu, którego potrzebujesz z nienazwanymi przestrzeniami nazw, jeśli chcesz po prostu zadeklarować funkcję lub obiekt z wewnętrznym połączeniem.źródło
static class ...
, OTOH, nie zadziała.namespace {
” i „}
”?Spróbuję odpowiedzieć na Twoje pytanie, chociaż jest to stare pytanie i nie wygląda na bardzo ważne (naprawdę nie jest bardzo ważne samo w sobie ), a otrzymałem już całkiem dobre odpowiedzi. Powodem, dla którego chcę na nie odpowiedzieć, jest to, że odnosi się to do fundamentalnych kwestii ewolucji standardu i projektowania języka, gdy język jest oparty na istniejącym języku: kiedy należy wycofać, usunąć lub zmienić funkcje języka w niekompatybilny sposób?
Właściwie to połączenie.
Wycofanie oznacza:
Ta ostatnia kwestia jest ważna. Chociaż nigdy nie ma formalnej obietnicy, że twój program nie zostanie złamany, czasami po cichu, zgodnie z następnymi standardami, komitet powinien starać się unikać łamania „rozsądnego” kodu. Wycofanie się powinno powiedzieć programistom, że nieuzasadnione jest poleganie na jakiejś funkcji .
Zachowanie wspólnego podzbioru C / C ++ jest bardzo ważne, szczególnie w przypadku plików nagłówkowych. Oczywiście,
static
deklaracje globalne są deklaracjami symboli z wewnętrznymi powiązaniami, co nie jest zbyt przydatne w pliku nagłówkowym.Ale problem nigdy nie polega tylko na zgodności z C, jest to kompatybilność z istniejącym C ++: istnieje mnóstwo istniejących programów w C ++, które używają
static
globalnych deklaracji. Ten kod jest nie tylko formalnie legalny, ale także rozsądny, ponieważ wykorzystuje dobrze zdefiniowaną funkcję językową w sposób, w jaki jest przeznaczony .Tylko dlatego, że istnieje obecnie „lepszy sposób” (według niektórych) na zrobienie czegoś, nie czyni programów napisanych w starym stylu „złymi” lub „nierozsądnymi”. Umiejętność używania
static
słowa kluczowego w deklaracjach obiektów i funkcji w zakresie globalnym jest dobrze rozumiana zarówno w społecznościach C, jak i C ++, i najczęściej używana poprawnie.W podobnym duchu nie zamierzam zmieniać rzutów w stylu C
double
nastatic_cast<double>
tylko dlatego, że „rzuty w stylu C są złe”, ponieważstatic_cast<double>
dodaje zero informacji i zero bezpieczeństwa.Pomysł, że za każdym razem, gdy wymyślany jest nowy sposób zrobienia czegoś, wszyscy programiści spieszyliby się, aby przepisać swój istniejący, dobrze zdefiniowany działający kod, jest po prostu szalony. Jeśli chcesz usunąć całą odziedziczoną C brzydotę i problemy, nie zmieniasz C ++, tylko wymyślasz nowy język programowania. Pół-usunięcie jednego użycia
static
prawie nie czyni C ++ mniej brzydkim.Zmiany kodu wymagają uzasadnienia, a „stare jest złe” nigdy nie jest uzasadnieniem dla zmian w kodzie.
Przełamywanie zmian językowych wymaga bardzo mocnego uzasadnienia. Trochę uproszczenie języka nigdy nie jest usprawiedliwieniem dla przełomowej zmiany.
Podane powody
static
jest zły, są po prostu wyjątkowo słabe i nie jest nawet jasne, dlaczego zarówno obiekty, jak i deklaracje funkcji nie są razem przestarzałe - nadanie im innego traktowania prawie nie czyni C ++ prostszym lub bardziej ortogonalnym.Więc naprawdę jest to smutna historia. Nie z powodu praktycznych konsekwencji, jakie miał: miał dokładnie zero praktycznych konsekwencji. Ale ponieważ pokazuje wyraźny brak zdrowego rozsądku ze strony komitetu ISO.
źródło
static
lub anonimowych przestrzeni nazw, nie zachęcam ani nie zniechęcam. Chodzi mi o to, że jeśli naprawdę chcesz zniechęcić ludzi do używania anonimowych przestrzeni nazw, musisz dać im dobry argument. W praktyce uważam, że w większości implementacji encje zadeklarowane w nienazwanej przestrzeni nazw są symbolami eksportowanymi z losową nazwą, powiększając tym samym tabelę eksportu. Podmioty zadeklarowane jakostatic
OTOH nie są w żaden sposób eksportowane. Tak więc wiele osób decyduje się na podstawie tej obserwacjistatic
.static
nigdy nie zniknie, więc niewłaściwe jest jego wycofywanie. „ Jednak nie argumentujesz, że zniechęcanie do jego używania jest złe. ” Nie widziałem żadnego przekonującego argumentu, który wskazywałby, że użycie zakresu przestrzeni nazwstatic
jest „niewłaściwe”. Deprecjonowanie go tylko po to, aby zniechęcić do jego używania, jest złe, ponieważ nikt tak naprawdę nie wierzy, że zniknie, i ponieważ nie przekonuje ludzi, że używanie go jest „złe”.Przestarzałe lub nie, usunięcie tej funkcji języka złamałoby istniejące kody i zirytowało ludzi.
Cała statyczna dezaprobata polegała na myśleniu życzeniowym w stylu „anonimowe przestrzenie nazw są lepsze niż statyczne” i „odwołania są lepszymi wskaźnikami”. Lol.
źródło
char* foo = new char; char& ref = *foo;
To, że na początku otrzymałeś wskaźnik, nie mówi nic o twojej zdolności do używania referencji.