•  

    Dzień dobry Wykopowicze! ( ͡º ͜ʖ͡º)

    Czy wiecie, że wczoraj wieczorem pojawił się nowy odcinek kursu "Nowoczesny C++ od podstaw" od Wojtka Razika? (⌐ ͡■ ͜ʖ ͡■)

    Dzisiaj Wojtek porusza temat pętli, sprawia że groźne komentarze stają się jeszcze groźniejsze i gra w napisaną przez siebie (prostą) grę! ᕙ(⇀‸↼‶)ᕗ

    https://www.youtube.com/watch?v=7oA5cZqzEnE (。◕‿‿◕。)

    Miłego oglądania! ʕ•ᴥ•ʔ

    pokaż spoiler #programowanie w #jezykc i #cpp, #technologia dla #programista15k, #ciekawostki i #nauka dla #naukaprogramowania

    źródło: nowoczesny-cpp.png

    •  

      @CppPolska: W 2019 roku C++ i nowoczesny to oksymorony

    •  

      W 2019 roku C++ i nowoczesny to oksymorony

      @Plotkova99: Po każdym takim komentarzu umiera jedna kość RAM

    •  

      @b33zon: Nazywanie języka z 1983r. nowoczesnym ;). C# jeszcze można powiedzieć, że jest nowoczesny, C++ to dobry ale nie nowoczesny język.

    •  

      Nazywanie języka z 1983r. nowoczesnym ;). C# jeszcze można powiedzieć, że jest nowoczesny, C++ to dobry ale nie nowoczesny język

      @Plotkova99: Tesla nie jest nowoczesnym samochodem, samochody powstały w 1886 roku....

      C++ cały czas się zmienia, to że powstał dawno temu nie ma znaczenia. Gdyby język nie był rozwijany i powszechnie używany, wtedy zrozumiałbym narzekania.

      Prawdą jest, że C++ nie wszędzie ma zastosowanie - używa się go głównie tam, gdzie potrzeba dużej wydajności.

    •  

      @b33zon: @Plotkova99: Dorzucę swoje grosze ( ͡º ͜ʖ͡º)

      Dziś wiele osób tworzy w językach "ultra wygodnych", nie przejmując się niczym. Przez to proste aplikacje potrafią mulić, bo są napisane w JavaScript. Przez bycie wygodnym ludzie zapominają, w jaki sposób działa komputer i że można zrobić coś działającego znacznie szybciej, korzystając z innego narzędzia. Potem ktoś na apkę pisaną w JSie narzuci swoją abstrakcję (nie pozwól Boże, by wrzucić do tego przeglądarkę/electrona), napisaną w kolejnym wolnym języku, i nagle prosta apka zajmuje 2GB pamięci.

      pokaż spoiler Nie, nie jadę po JS. Każdy język ma swoje zastosowanie, ale przez wojenki językowe ludzie zapominają o użytkowniku końcowym, co jest mega nie w porządku ( ͡° ʖ̯ ͡°)

    •  

      @b33zon: Nazwanie C++ nowoczesnym JEST nadużyciem. Tak można nazwać C# jak wspomniałam wcześniej. C++ można nazwać potężnym, popularnym, uniwersalnym, przystępnym.

    •  

      @Plotkova99: "Nowoczesny C++" to nie to samo co "C++ jest nowoczesny".
      "Stary C++" vs "Nowoczesny C++"
      "Nowoczesny język programowania" vs "Stary język programowania".

      Termin "Nowoczesny C++" jest po to, żeby odróżnić od starego C++, pełnego wkaźników, tablic i innych rzeczy, które nie są już potrzebne

    •  

      @b33zon: Nie kupuję tego tłumaczenia ale ok ;) to duży skrót myślowy, "Nowoczesny C++" to nie to samo co piszesz czyli nowe podejście do C++.

    •  

      @Plotkova99: Kek, bo w standardzie z przyszłego roku, będzie dalej można pisać jak w 1983 więc trzeba się przysrać że nie jest nowoczesny... Przykro mi, jak nie potrafisz kodzić nowoczesnego C++, dlatego się nie wypowiadaj. Miano nowoczesnego C++ posiada tylko kod w którym użycie nowych składni takich jak lambdy, coroutyny, concepty zwiększają przejrzystość i czytelność kodu, czy błędów kompilacji.

    •  

      @CppPolska: ja najbardziej szanuję obóz który próbuje wszystko usprawnić do granic możliwość zachowując przy tym jak najlepszy wygląd. Mowa tu o apkach desktopowych. Osobiście używam electron+typescript+react/vanilla do budowy frontu apki a sam core piszę w języku takim jak GO po czym jak już wszystko jest gotowe to próbuję go przepisać na Rusta. I mówie tu o moich projektach hobbystycznych na githuba.

    •  

      @Snowdr0p: projekty hobbistyczne - chyba najlepiej napisane projekty ever (。◕‿‿◕。) łap plusa! ( ͡º ͜ʖ͡º)

    •  

      @CppPolska: Czemu uczycie C++ od podstaw skoro jest pierdyliard tutków do nauki podstaw?

    •  

      @Marek1991: Bo wszystkie uczą gównianego C++, ze wskaźnikami, tablicami i innymi niepotrzebnymi rzeczami, które utrudniają naukę języka. Plan jest taki, żeby w ogóle nie pokazywać że jest coś takiego jak wskaźnik, pracować tylko na referencjach, bardzo szybko pokazać std::vector, pamięcią zarządzać tylko przez smart pointery.

    •  

      @CppPolska: ja mam inne pytanie, czemu tagujecie #jezykc skoro C++ z prawdziwym C nie ma nic wspólnego, chyba że black metal jest podobny do reggae. Jestem w stanie sobie wyobrazić, że kogoś interesuje C, a ma gdzieś c++ (specjalnie z małej).

    •  

      @b33zon: No dokładnie, a w zalinkowanym filmiku jest o pętli for XDDD

    •  

      @Marek1991: Kurs z założenia jest dla osób, które nie znają jeszcze C++. Dlatego najpierw są prymitywy, fajniejsze rzeczy będą później.

    •  

      @zwei: C od C++ różni się wiele, ale obydwa te języki są sobie dosyć bliskie (niejako C++ był i w sumie jest rozszerzeniem C).

    •  

      @CppPolska: ok xD ale to nie jest odpowiedź na moje pytanie.

    •  

      @Plotkova99: C++ co trzy lata (od 2011) ma aktualizacje pod względem rozwoju języka (składnia) jak i jego biblioteki standardowej.

      Obecnie kończy się standaryzacja dla wydania na 2020, symbolicznie reprezentowanego jako C++20. Po drodze były C++17, C++14, C++11.

      Każde następne wydanie celuje w kompatybilność wsteczną oraz dodaje nowości.

      C++20 będzie wydaniem, które niczym C++11 bardzo zmieni język przez swoje nowe smaczki (Concepts, Modules).

      Java również ma wydania.
      C# również ma wydania i prężnie się rozwija w ramach .NET Core.
      JavaScript również.
      Python3 także.
      Rust, GoLang też.

      Potencjalnym zastępcą C++ jest język Rust.

    •  

      @CppPolska: to się nadaje dla zwierzaka? Zacząłem i formatyke i mam na uczelni cpp. Szukam właśnie jakiegoś ciekawego kursu.

    •  

      @CppPolska: Dobra ja się teraz przysram do czegoś. Skąd taka nienawiść do nagłówka random?
      Poza tym nie potraficie nawet tego poprawnie używać. Tworzenie lokalnie generatora do pobrania co najwyżej 32 bitów entropii nie ma kompletnie sensu i równie dobrze można by przekazać tam referencje do std::random_device.
      Z powodzeniem przestarzałe std::rand() można zastąpić std::random_device{}(), jako że standardowy std::random_device jest już dużo lepiej implementowany. Dalej, jeżeli chcielibyśmy uzyskać jakkolwiek określoną wydajność do generowania wielu liczb, to dopiero wtedy trzeba użyć generatora liczb pseudolosowych, współdzielonego dla tych wywołań. W każdym razie dla mnie ten kod nie jest jakiś szczególnie skomplikowany:
      auto dice(int min,int max) {
          static std::random_device rd{};
          return std::uniform_int_distribution<>{min,max}(rd);
      }

    •  

      @lionbest: Dzięki, takie komentarze to lubię! Przyznam szczerze, że jest to po prostu kopia ze stackoverflow, nie chciałem się rozwodzić bo z punktu widzenia kursu to i tak nieistotny kawałek kodu.

      Zrobię update materiałów, upraszczając tę funkcję. Dzięki!

    •  

      @b33zon: A jak chcesz już pokazać lambdy to łap przykład jak zrobić poprawnie kostkę na lambdach: https://godbolt.org/z/hSIxvX

    •  

      @CppPolska: Czytałem dawno temu, że C++ jest językiem znienawidzonym przez "starych" (zatwardziałych) programistów, którzy wciąż wolą ANSI C czy nawet pisać w ASM (i pewnie nadal by to robili, gdyby nie różnorodność platform), ponieważ zbyt wiele rzeczy zostało tam uproszczonych w stosunku do oryginalnego C. Zresztą sam twórca Linuxa - Linus Torvalds wspomniał, że jest... delikatnie mówiąc "uprzedzony" w stosunku do C++ (tutaj oraz tutaj tłumaczenie dlatego tak sądził).

      Co wy na to?

    •  

      @Seif: Każdy ma to, co lubi ( ͡º ͜ʖ͡º) C jest bardzo prosty, i to jest jego główna zaleta. Btw. mamy wpis porównujący C i C++ w kategorii szybkości kodu wynikowego (⌐ ͡■ ͜ʖ ͡■)

      https://cpp-polska.pl/post/czy-c-jest-wolniejszy-od-cij-kilka-slow-o-zero-cost-abstraction

    •  

      @Seif: Środowisko C++ nie szanuje Linusa xd. Rzeczywiście, jest grupa "zatwardziałych" leśnych dziadków, którzy hejtują C++, ale świat embedded zmierza w kierunku linux + C++. Bare metalowych aplikacji w niskopoziomowym C jest coraz mniej. Warto wspomnieć, że nawet jeśli mamy już tego C++ na mikroprocek, to bardzo często możemy zapomnieć o bibliotece standardowej...

    •  

      Termin "Nowoczesny C++" jest po to, żeby odróżnić od starego C++, pełnego wkaźników, tablic i innych rzeczy, które nie są już potrzebne

      @b33zon: Ej no... nie zgodzę się, że tablice nie są potrzebne. To że w C++ można już swobodnie używać kolekcji takich jak wektor i iterować po nich przyjemnie jak w pythonie nie oznacza że tablice są passe...

      Potem przychodzi do mnie studenciak nabity abstrakcjami z YTbowych poradników i do prostej real-timowej aplikacji potrzebuje superkomputera bo mu nie wyrabia... I nie rozumie dlaczego push_back()* w pętli przetwarzającej dane to jest pomysł na śmierć.

      * zwiększanie rozmiaru wektora jest kosztowne bo w pewnym momencie wymaga alokacji pamięci (syscall) i jeszcze zdarzy się przepisanie całego dotychczasowego wektora w celu zapewnienia ciągłej przestrzeni pamięci tego kontenera

      A studenciak-amator miał tylko zrobić akwizycję kilku mega sampli z radia, przefiltrowania, zdecymowania i popchnięcie do następnego wątku przetwarzającego. A można było prealokować pamięć (new), używać jej jak tablicy, nie zwalniać po bloku przetwarzania tylko użyć ponownie i robić to "w stylu" C. A w innym miejscu programu wykorzystać wektor, dynamiczne zarządzanie pamięcią - tam gdzie wydajność nie jest krytyczna a "wygodność" ma znacznie.

      Za to lubię współczesne C++. Bez kombinowania, można w nim napisać na różnych poziomach abstrakcji. Można sobie zrobić model bottom-up, zbudować własny model danych, przeciążyć operatory i pojechać wysoko w abstrakcji a tam gdzie trzeba wykorzystać pełny potencjał maszyny, schodząc do wskaźników i ręcznie zarządzając pamięcią. Bez wychodzenia z języka, środowiska czy nawet wzorców projektowych.

    •  

      Środowisko C++ nie szanuje Linusa xd. Rzeczywiście, jest grupa "zatwardziałych" leśnych dziadków, którzy hejtują C++, ale świat embedded zmierza w kierunku linux + C++. Bare metalowych aplikacji w niskopoziomowym C jest coraz mniej. Warto wspomnieć, że nawet jeśli mamy już tego C++ na mikroprocek, to bardzo często możemy zapomnieć o bibliotece standardowej...

      @b33zon: Przykładem jest Arduino. C++ przykrojony do mikrych zasobów. Nie ma tam za dużo tego C++ ale klasy można sobie zrobić i bardzo ładnie skomponować kod. Użyć OO nie do abstrakcji a do podzielenia programu na części. Jest to znacznie wygodniejsze niż "plain C", zwłaszcza dla osób piszących we współczesnych językach.

    •  

      @kwanty: Arduino to nie jest najlepszy przykład, przestarzały kompilator i brak nowych standardów. Lepiej mówić o Armach w trybie thumb2, kompilowane najnowszym clangiem, da się. Szkoda, że tak mało SDK to wspiera.

    •  

      @kwanty:

      Ej no... nie zgodzę się, że tablice nie są potrzebne. To że w C++ można już swobodnie używać kolekcji takich jak wektor i iterować po nich przyjemnie jak w pythonie nie oznacza że tablice są passe...

      Potem przychodzi do mnie studenciak nabity abstrakcjami z YTbowych poradników i do prostej real-timowej aplikacji potrzebuje superkomputera bo mu nie wyrabia... I nie rozumie dlaczego push_back()* w pętli przetwarzającej dane to jest pomysł na śmierć.

      * zwiększanie rozmiaru wektora jest kosztowne bo w pewnym momencie wymaga alokacji pamięci (syscall) i jeszcze zdarzy się przepisanie całego dotychczasowego wektora w celu zapewnienia ciągłej przestrzeni pamięci tego kontenera

      A studenciak-amator miał tylko zrobić akwizycję kilku mega sampli z radia, przefiltrowania, zdecymowania i popchnięcie do następnego wątku przetwarzającego. A można było prealokować pamięć (new), używać jej jak tablicy, nie zwalniać po bloku przetwarzania tylko użyć ponownie i robić to "w stylu" C. A w innym miejscu programu wykorzystać wektor, dynamiczne zarządzanie pamięcią - tam gdzie wydajność nie jest krytyczna a "wygodność" ma znacznie.

      Sorry, że Ci ziomeczku tak dosadnie napiszę, ale cały ten post można wyrzucić do kosza, bo wystarczy wywołać na początku std::vector::reserve, podając na ile elementów zarezerwować pamięć. Dzięki temu wcale nie musisz używać tablic, tylko możesz dalej używać wektora, bo żadnych realokacji, czy niepotrzebnego kopiowania danych nie będzie. I spokojnie możesz robić push_back w pętli.

      No i nie mieszaj więcej w głowach swoim studentom.

    •  

      @CppPolska: Skoro nowoczesny c++ to polecam przestać używać znaku równości jako operatora przypisania tylko używać {}

    •  

      Dziś wiele osób tworzy w językach "ultra wygodnych", nie przejmując się niczym. Przez to proste aplikacje potrafią mulić, bo są napisane w JavaScript. Przez bycie wygodnym ludzie zapominają, w jaki sposób działa komputer i że można zrobić coś działającego znacznie szybciej, korzystając z innego narzędzia. Potem ktoś na apkę pisaną w JSie narzuci swoją abstrakcję (nie pozwól Boże, by wrzucić do tego przeglądarkę/electrona), napisaną w kolejnym wolnym języku, i nagle prosta apka zajmuje 2GB pamięci.

      @CppPolska: Generalnie miałem się już nie wypowiadać pod wątkami o zasadności pisania C++, ale ten post przyznam trochę mnie striggerował do odpisania. A drażni mnie ciągle powtarzany mit o niezrównanej wydajności C++ względem innych języków programowania. Nie tak dawno podawałem przykłady Rusta i HPC# od Unity, jako języków (w zasadzie hpc to subset języka), które w wielu wypadkach wyprzedzają C++ pod względem wydajności. Z resztą, ciężko porównywać wydajność C++ do innych języków, bez uwzględnienia bezpieczeństwa, jakie niosą za sobą konkurencyjne języki (niekoniecznie wyższego poziomu). Powtórzę w zasadzie to co pisałem ostatnio. Problemem C++ jest przestarzały podstawowy kontekst programowania, który opiera się na niebezpiecznym dostępie do pamięci. Jest to problem leżący u podstaw tego języka i nie pomoże tutaj nadbudówka w postaci smart pointerów czy rozbudowanej abstrakcji nad wielowątkowością. Fakt jest taki, że ponad połowa dziur bezpieczeństwa wynika właśnie ze złego dostępu do pamięci. Intel i Microsoft zalecają by w nowych projektach nie używać C++, tylko nowoczesnych języków opartych na bezpiecznym dostępie do pamięci. Ja nie mówię, że operowanie na surowych wskaźnikach jest złe. Są przypadki, gdzie jest to konieczne i w zasadzie każdy nowoczesny język programowania daje możliwość pracy na gołęj pamięci, ale odbywa się to w jawnie wskazanym przez programiście kontekscie, co redukuje do minimum możliwość powstania przypadkowych podatności. Ciężko mi sobie wyobrazić, żeby C++ by w stanie obronić się przed Rustem. W tradycyjnych prostych aplikacjach, dawno przegrał z wysokopoziomową konkurencją, a Rust wygrywa w zastosowaniach niskopoziomowych łatwością pisania, bezpieczeństwem i bezkonkurencyjnym package managerem (crates.io stawiany jest za wzór tego jak powinny wyglądać tego typu mechanizmy). Jedyne co dziś broni c++'a to niedojrzałość konkurencji i stare molochy, których nie sposób dziś przepisać.

      Muszę jeszcze wrócić do tego objechania aplikacji pisanych w JS. Electron nie zdobył uznania przez prosty język, tylko przez to, że dał prawdziwie prosty mechanizm budowania wieloplatformowych interfejsów użytkownika w znanym środowisku, w dodatku z możliwością serwowania tego samego contentu w przeglądarce. Tutaj już nie jest kwestią wyboru, bo C++ nie oferuje żadnej alternatywy dla tego środowiska, a już na pewno nie taką, której koszt produkcji i utrzymania byłby porównywalny do electrona.

    •  

      @kwanty: a o std::array słyszałeś?

      Własności tablic C opakowane w piękny typ/interfejs.

      Kompilowany do tego samego co stare/prymitywne tablice. Bez dynamicznych alokacji.

      Ogólnie piękno typowania można poznać dzięki TypeScriptowi, a dokładniej jak potrafi "przetransformować" język.

    •  

      @Plotkova99: Windows też już jest stary i nienowoczesny.

    •  

      @KorwinizacjaPrzelyku:

      Sorry, że Ci ziomeczku tak dosadnie napiszę, ale cały ten post można wyrzucić do kosza, bo wystarczy wywołać na początku std::vector::reserve, podając na ile elementów zarezerwować pamięć. Dzięki temu wcale nie musisz używać tablic, tylko możesz dalej używać wektora, bo żadnych realokacji, czy niepotrzebnego kopiowania danych nie będzie. I spokojnie możesz robić push_back w pętli.

      No i nie mieszaj więcej w głowach swoim studentom.

      @patrolez:

      a o std::array słyszałeś?

      No właśnie... i potem studenciakom takim jak Wam trzeba klarować... Pan pierwszy mówi, że "push_back" w pętli będzie fajne... zamiast zrobić prostą operację inkrementacji (indeksu/wskaźnika) i przypisania to będziemy wywoływać metodę, przekazywać wartość (choćby przez referencję)? I to ma być szybsze??? Adresowanie przez wektora operatorem []? A w czym przeciążenie operatora będzie szybsze od wywołania metody? Tam dodatkowo trzeba przesłać referencję na obiekt.

      No to weźcie sobie przeanalizujcie ile kodu kompilator generuje przy obu tego typu operacjach... Jest takie fajne narzędzie: https://godbolt.org/

      Zrzut w załączniku.

      Pętla for ze zwykłą tablicą mieści się w linijkach 115:123. W 123 jest jump na początek, proste jak but.

      Petla for z push_back i prealokacją zajmuje linijki 161:169 ale... w linijce 166 jest "call", czyli wywołanie procedury (wywołanie funkcji/metody). To jest o wiele kosztowniejsze niż zwykłe przypisanie wartości pod adres.

      Zauważcie, że push_back wcale nie został skompilowany inline pomimo opcji kompilatora -O3.

      Vector/array to są bardzo fajne narzędzia, używam ich tak często jak się da ze względu na wygodę i bezpieczeństwo. Ale nie nadają się wszędzie - szczególnie tam gdzie ważna jest wydajność a operuje się na krótkich danych. Tam narzut na obsługę wysokiego poziomu zabija.

      Walczę z tym, żeby informatycy mieli świadomość tego czego używają. Mieli świadomość (albo chociaż sprawdzili!) które narzędzia gdzie się dobrze nadają.

      Nie wiem skąd takie obrzydzenie w używaniu zwykłych tablic. Przecież są o wiele prostsze w użyciu niż vector (mniej pisania, bardziej "naturalne", etc...).

      źródło: Screenshot_20191021_234720.png

    •  

      @kwanty: Szanuję, że Ci sie chciało przygotować taki przykład, ale wyciągnąłeś złe wnioski, bo źle odcyfrowałeś to, co się dzieje w assemblerze. Piszesz, że push_back nie został zinline'owany przez kompilator - fałsz, właśnie został - w linijce 161, do pojedynczej instrukcji mov! Ten call, o którym piszesz, w linijce 166, to realokacja wektora, która w tym konkretnym przypadku się nie wywoła, bo zrobiłeś wcześniej reserve na 100 elementów.

      BTW, Twoje porównanie nie do końca jest uczciwe, bo tablicę zaalokowałeś na stosie (dokładnie zerowy koszt alokacji, 1 instrukcja przesuwająca wskaźnik stosu, która i tak jest potrzebna, jeśli funkcja cokolwiek trzyma na stosie), a vector trzyma bufor na stercie (malloc może być kosztowny). Natomiast wcześniej pisałeś o dynamicznej tablicy (wspominałeś o new) vs vector.

      +: kwanty
    •  

      Jedna sekunda dłużej filmiku i człowiek miałby uśmiech na twarzy a tak to ( ͡° ʖ̯ ͡°)

    •  

      @kwanty: std::array jest tak samo statyczne, jak zwykłe tablice w stylu C, ale mają potrzebne metody do bycia kompatybilnym typem z STL-em.

      std::array ma taką własność, że standard nie pozwala używać go naprzemiennie ze wskaźnikiem - co właśnie jest tym powiewem nowoczesnego C++, gdzie ten celuje w minimalizację występowania operacji na wskaźnikach.

      pokaż spoiler std::array != std::vector


      Kompilują się do identycznego kodu maszynowego co tablice w stylu C.
      To podchodzi pod tzw. zero-cost abstraction https://cpp-polska.pl/post/czy-c-jest-wolniejszy-od-cij-kilka-slow-o-zero-cost-abstraction

      Link do pewnego godbolta do zabawy:
      https://godbolt.org/z/vIAEPs

      EDIT:
      Już widzę, że link był wklejany tutaj wcześniej :D

      +: kwanty
    •  

      @KorwinizacjaPrzelyku: @patrolez: Dzięki za poprawki. Rzeczywiście nie zauważyłem linii 166, jeżeli pętla kończy się wcześniej to skacze do 150 i jest dłuższa od tego poprzedniego fora. Jestem ciekawy jak szybko będą się wykoywanć obie pętle.

      W tym przypadku chciałem porównać samą pętlę. To czy będzie na stosie czy stercie (jeżeli wcześniej zrobię NEW nie ma znaczenia).

      Anyway, nadal nie użył bym push_back() nawet gdyby było tak samo szybkie. Może nie powiedziałem tego wcześniej ale przykład pochodził z przetwarzania sygnału ciągłego. Ta pętla była wykonywana wielokrotnie. Więc użycie ponowne istniejącego bufora jest właściwe co narzuca indeksowanie bezwzględne lub inkrementowanie pomocniczego wskaźnika inicjowanego na początku pętli (czasami *tab++=i może być szybsze).

    •  

      @Sempaaj: Zależy od urządzenia

      źródło: Screenshot_2019-10-22-08-27-57-618_com.google.android.youtube.png

    •  

      @Plotkova99: Sformułowanie "nowoczesny C++", czy też "modern C++" odnosi się do zbioru zasad o dobrych praktykach, które weszły w życie wraz z C++11 i poprawkami w C++14. Wywodzi się z książki "Effective Modern C++". Nie jest to stwierdzenie, że język C++ jest nowoczesny (bo to może być dyskusyjne) tylko sformułowanie rozróżniające ten język od C++ sprzed 2011 roku. Moglibyśmy zrobić język C+++, który byłby wstecznie kompatybilny z językiem C++ (który obecnie jest nazywany C++98 lub C++03) ale tego nie zrobiliśmy. Dlatego zwrot "Nowoczesny C++" jest pomocny i jest w społeczności szeroko używany. Być może Wojtek powinien o tym powiedzieć kilka zdań w którymś z kolejnych odcinków.

      +: b33zon

Gorące dyskusje ostatnie 12h