1. C++ / Говнокод #26451

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    #include <array>
    #include <iostream>
    using namespace std;
    
    
    int main() {
        ::array arr {1, 2, 3};
        int a, b, c;
        ::tie(a, b, c) = arr;
        printf("%d %d %d",a,b,c);
        return 0;
    }

    https://godbolt.org/z/RRmruC

    Запостил: 3.14159265, 25 Февраля 2020

    Комментарии (107) RSS

    • Пока скриптухи на каждый чих завозят новый синтаксис в С++ просто добавляют std::tie.

      Именно поэтому за «С++».
      Ответить
      • > завозят новый синтаксис

        auto [a, b, c] = arr; проверь.
        Ответить
        • Так это в угоду скриптухам чтобы было похоже на js.
          Ответить
        • Так-то пиздец конечно. В лучших традициях С++.

          Уже имея годные библиотечные функции, придумывать ещё 1000 способов сделать то же самое.

          А spread rest как в jse ещё не завезли?
          [a, b, ...rest] = [10, 20, 30, 40, 50];
          console.log(a); // 10
          console.log(b); // 20
          console.log(rest); // [30, 40, 50]
          Ответить
          • Именно поэтому я за js
            Ответить
          • показать все, что скрытоvanished
            Ответить
          • Нашёл, как эта питушня называется:
            https://en.cppreference.com/w/cpp/language/structured_binding

            Вроде в C++17 и в C++20 многоточия пока не завезли.

            P.S. На всякий случай табличка, в каких компиляторах какую питушню реализовали:
            https://en.cppreference.com/w/cpp/compiler_support
            Ответить
            • Вторая ссылка — ультраценная.

              Прям https://caniuse.com/

              При том что много С++17 питушни до сих пор в либо trunkе, либо ещё нету.

              Например такая простая херь как инициализация массива без size (Array size deduction in new-expressions), у меня в только шланге работает.

              https://en.cppreference.com/w/cpp/container/array/deduction_guides
              Я такую простую питушню дждесять лет ждал.

              Меня вот что дико удивляет, что они кучи какой-то сложнейшей constexpr хуйни могут делать, а вывести размер std::array в compile-time не осилили.
              Ответить
              • Там же вроде только запятые посчитать? Или есть какие-то подводные камни?
                Ответить
                • Да хз. Всякие хитрые штуки вроде variadic templates ещё в С++11 осилили, а нормальную инициализацию массива как в сишке не могли сделать ГОДАМИ.
                  int a[]={1,2,3};

                  Но меня всегда дико бесила в крестах эта, и подобные ей мелочи.

                  Вроде нормальный навороченный язык, но как специально тысячи зацепочек специально чтобы злить программиста.
                  Ответить
                • При том что классические stl-контейнеры list и vector никогда размера не требовали.
                  vector<int> v = {1,2,3,4};
                  list  <int> l = {1,2,3,4};

                  https://ideone.com/Y3dAZ5
                  Ответить
                • >Или есть какие-то подводные камни?
                  Вообще array — тип с фиксированным числом значений, известным на этапе компиляции.

                  Если он будет передавать аргументом и ложиться в какие-то структуры, там действительно без числа элементов трудно обойтись.

                  Или придётся как в сишке петушиться с массивами, size_t передавать. Ибо sizeof для аргументов не работает.
                  Ответить
              • > Вторая ссылка — ультраценная.
                > Прям https://caniuse.com/
                Интересно, где-то есть ИИ, который анализирует код на C++ и говорит, на каком языке он написан?
                Ответить
                • В конпелятор встроен. Там ошибки в духе "это фича из с++17, компиль с соотв. параметром".
                  Ответить
                  • Компилятор это сообщает, только если в его текущей версии эта фича из C++17 реализована. А если её не реализовали, он скажет, что это синтаксическая ошибка, и умолчит о том, что она есть в стандарте, а реализовывать её поленились.
                    Ответить
                    • Т.е. ИИ должен понять ход мыслей стандартизаторов чтобы понимать новые фичи, которым его ещё не обучали?
                      Ответить
                      • Не обязательно понимать ход мыслей. Смотри, выше пример про «deduction guides for std::array».

                        Это фича из «C++20». «gcc», начиная с 8-й версии заявляет частичную поддержку «C++20». У «gcc» есть параметр --std=c++20 либо c++2a либо gnu++20 либо gnu++2a. Однако, «gcc» не сообщает, что это фича из «C++20». И 9-я, и 10-я версия «gcc» говорят, что это синтаксическая ошибка. В это же время в «clang» эта фича работает.
                        Ответить
    • > using namespace std

      Ну зачем? std - не boost::some::crazy::shit::with::many::colons...
      Ответить
      • А зачем вообще писать на крестообразном говне ? Почему не просто boost ?
        Ответить
    • > ::tie(a, b, c) = arr;
      Интересно, ГЦЦ не хочет жрать даже с -std=c++2a
      error: no match for 'operator=' (operand types are 'std::tuple<int&, int&, int&>' and 'std::array<int, 3>')
      Ответить
    • Перепиши на сишный препроцессор. Я не обязан разбираться во всяком std::kokoko
      Ответить
      • Сишка — говно ёбанное.

        Я не от хорошей жизни std::array пишу.

        В Сишке массивы не передаются по значению, а только как указатели.

        От этой сишкопитушни возникает множество багров.
        Ответить
        • Даже «Паскаль» лучше: в нём массивы можно передать по значению.

          Почему в сишке массив передаётся как указатель, а тот же самый массив, завёрнутый в структуру, состояющую из единственного поля, — уже по значению? Чем структура лучше массива?
          Ответить
          • Так ещё проблема в том что в сигнатуре функции аргумент можно написать как int[] и как int*

            То есть переменная визуально выглядит как массив, однако sizeof и всё остальное будет работать как на указателе.

            Пару лет назад Линус эпично расставлял точки над этой хуйнёй.
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Да какой макак, люди в кернеле ошибки делали.

                .. and others say that the most notable feature is the idiotic bugs
                that it introduces, and the compiler even complains about.
                
                Christ, people. Learn C, instead of just stringing random characters
                together until it compiles (with warnings).
                
                This:
                
                  static bool rate_control_cap_mask(struct ieee80211_sub_if_data *sdata,
                                                   struct ieee80211_supported_band *sband,
                                                   struct ieee80211_sta *sta, u32 *mask,
                                                   u8 mcs_mask[IEEE80211_HT_MCS_MASK_LEN])
                
                is horribly broken to begin with, because array arguments in C don't
                actually exist. Sadly, compilers accept it for various bad historical
                reasons, and silently turn it into just a pointer argument. There are
                arguments for them, but they are from weak minds.
                
                But happily gcc has a really really valid warning (kudos - I often end
                up ragging on the bad warnings gcc has, but this one is a keeper),
                because a few lines down the mistake then turns into pure and utter
                garbage.
                
                It's garbage that was basically encouraged by the first mistake
                (thinking that C allows array arguments), namely:
                
                                  for (i = 0; i < sizeof(mcs_mask); i++)
                
                the "sizeof(mcs_mask)" is _shit_. Since array arguments don't actually
                exist in C, it is the size of the pointer, not the array. The first
                mistake makes the bug look like reasonable code. Although I'd argue
                that the code would actually be bad regardless, since "sizeof" is the
                size in bytes, and the code actually wants the number of entries (and
                we do have ARRAY_SIZE() for that).

                https://lkml.org/lkml/2015/9/3/428
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • >как-то страшно, что ядрописатели такие лулзы делают

                    Ну может и такое быть: кто-то писал подуставший. Решил отрефакторить кусок рабочего кода в метод.

                    А там не sizeof был, а стояло макро ARRAY_SIZE.
                    #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))

                    Ну человек смотрит: тут int[], там array, вроде порядок.
                    Ответить
                    • Был Линус уставший,
                      Коммитил в ядро.
                      Из бездны восставший
                      улыбался Дидро
                      Ответить
                • показать все, что скрытоvanished
                  Ответить
                • >> Learn C, instead of just stringing random characters together until it compiles

                  Обалденный совет.
                  Ответить
                  • Я что-то похожее в Windows 98 (или может 95? хуй знает) делал - открывал Блокнот, писал в нем какую-то хуйню, сохранял как .com файл и запускал, потом менял текст и опять запускал, до тех пор пока какая-то хуйня не происходила
                    Ответить
              • and the warning looks like so:
                
                  net/mac80211/rate.c: In function ‘rate_control_cap_mask’:
                  net/mac80211/rate.c:719:25: warning: ‘sizeof’ on array function
                parameter ‘mcs_mask’ will return size of ‘u8 * {aka unsigned char *}’
                [-Wsizeof-array-argument]
                     for (i = 0; i < sizeof(mcs_mask); i++)
                
                note the lack of warning about the use of an array in the function
                definition parameter list - I tried to find if there's any way to
                enable such a warning, but couldn't find anything.
                
                Ahh. Google shows that it's an old clang warning that gcc has recently
                picked up.
                
                But even clang doesn't seem to have any way for a project to say
                "please warn about arrays in function argument declaration". It *is*
                very traditional idiomatic C, it's just that I personally think it's
                one of those bad traditional C things exactly because it's so
                misleading about what actually goes on. But I guess that in practice,
                the only thing that it actually *affects* is "sizeof" (and assignment
                to the variable name - something that would be invalid for a real
                array, but works on argument arrays because they are really just
                pointers).
                Ответить
        • > В Сишке массивы не передаются по значению, а только как указатели.

          В ассемблере нет никакой передачи массивов по значению, так что это все тупые анскильные абсракции, которые надо нахуй выкинуть.
          Ответить
        • И да, в Сишке как раз можно массив передать по значению, если его хуйнуть в структуре. Но это все анскильно
          Ответить
        • Так это ведь правильно, что за дурень захочет по значению массив копировать ?
          Ответить
          • >что за дурень захочет по значению массив копировать ?
            Я хочу.
            std::array<int16_t,4>

            Это ведь не PHP. Передача аргумента превращается компилером в простой mov rax.
            Ответить
          • Хотят программисты, использующие алгоритмы сложнее обхода массива.
            Ответить
            • показать все, что скрытоvanished
              Ответить
              • Да, есть.
                Ответить
              • Да. Я читаю ГК, а тут комментарии иерархически расположены. Обхожу дерево.
                Ответить
                • показать все, что скрытоvanished
                  Ответить
                  • Сколько тебе заплатили за написание этого комментария?
                    Ответить
                    • показать все, что скрытоvanished
                      Ответить
                      • Длина комментария ограничена двумя тысячами символов. Чтобы написать корректный комментарий, необходимо уложиться в этот лимит. Следовательно, при написании этого комментария ты использовал математику. Сколько тебе за это заплатили?
                        Ответить
                        • показать все, что скрытоvanished
                          Ответить
                          • Только что ты либо обошёл дерево (в случае, если ты просматриваешь пост по прямой ссылке), либо извлёк голову LIFO очереди (в случае хузостока/ТГ). Сколько тебе платят за применение таких алгоритмов?
                            Ответить
                            • показать все, что скрытоvanished
                              Ответить
                              • Более того, прямо сейчас твой мозг строит сложный граф из слов этого комментария. Сколько ты получаешь за это?
                                Ответить
                              • Какой изысканный багор ))) Плюсанул за оригинальную психозу.

                                Не, ну как без дерева-то? Без дерева наверно только ассемблерщики пишут. Обмажутся массивами и дрочат стек.
                                У меня и DOM в браузеропитухе, и структура файлов в файловой системе. Всё деревья*.

                                _______________
                                * а файлопитух с симлинками - и вовсе граф
                                Ответить
                                • Надо запилить генератор Сёмы. Какое-нибудь гауссово миксование из русни, помойки, математики в Рашке, винде на флешке и насе на SMB1.
                                  Ответить
                                  • Русня только и может завидовать странам первого мира, у которых есть время на установку винды на флешку. У русни времени не остаётся. Всё время уходит на изучение математики, а ведь его можно было потратить на поход на помойку, где лежит нас на SMB1.
                                    Ответить
                                    • Неплохо. Главный специалист в базисном кобенировании по алгоритмическим вореантным шаблонам — профессор доброе имя доброе слвао имя имярек в чести ПИ. Надо бы у него спросить квант кобенного зожатия.
                                      Ответить
                                      • >профессор доброе имя доброе слвао имя имярек в чести ПИ

                                        А это я для кого выкладывал?

                                        https://govnokod.ru/26415

                                        >Надо запилить генератор Сёмы.
                                        Осталось дополнить актуальными фразочками типа «пердолишься», «прыщи на флешке», «Есть реальный пример».

                                        Вот нейронная сеть бы здесь очень помогла правильно их нормально склонять и втыкать в нужные места.
                                        Ответить
                                        • Вот если даже ИИ для генератора Сёмы не удастся сделать, то автоответчик для ПИ - вполне. Лет через пять абсолютно на любой вопрос на ГК можно будет ответить электронным ПИ: "а вот у меня был скрипт <ссылка на ГК>" или "ну я это ещё давно говорил <ссылка на ГК>" или "а вот надо было слушать царя <ссылка на ГК>".
                                          На самом деле, такой скрипт был написан и работает с 2019 года, а сами ПИ с ГК ушёл.
                                          Ответить
                                          • Ну я это ещё давно говорил, что в любой непонятной ситуации надо было слушать Царя <ссылка на скрипт иммитирующий superhackkiller1997>
                                            Ответить
                                          • неплохо. главный говноязык специалист в базисном маздайка говноязык кобенировании по алгоритмическим вореантным питушня для питушков шаблонам — питушара анскильная днище профессор доброе имя анскильное говно доброе слвао , слился как животное, говно имя имярек штеуд в чести , днище галимое, пи

                                            а это я ко-ко-ко бездарный питух для кого выкладывал?
                                            Ответить
                                          • да какой заедушный питушок макак, люди , анскилябра, в кернеле анскильное говно ошибки в духе "это фича из c++17 и анскилябра, в заедушный c++20 многоточия пока говно не завезли?

                                            бездарный питух за js и да, в Царь сишке как питушара анскильная раз можно массив передать по значению, так что анскильное говно тебе питушку это фича говно из c++17 реализовывать тебе питушку понять ход мыслей. заедушный , животное, смотри, выше пример».

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

                                            макак пытается бороться с Сишка, питух, анскильный питух, sql инъекциями, заедушный говноязык xss, говно
                                            Ответить
                                          • Вот , питух, иди кукарекай, тебе питушку если даже я тут Царь ИИ для генератора Сёмы ко-ко-ко. Я Царь, лалка, автоответчик для ПИ - и ещё раз повторю, тебе животное: вполне.

                                            Животное, абсолютно на тебе питушку любой заедушный вопрос на ГК ну я это анскильный ещё давно говорил <ссылка тебе питушку на ГК>
                                            А ты днище галимое, надо было слушать царя заедушный питушок <ссылка на ГК>.
                                            Ответить
                                            • >Надо запилить генератор Сёмы. Какое-нибудь гауссово миксование из русни
                                              я не от хорошей на свалке жизни std::array

                                              на свалке что за дурень руснявый cтекломойный захочет по значению, если стекломойный русачок его хуйнуть на свалке, так что на свалке это синтаксис русня в с++ просто на флешку добавляют std::tie.

                                              именно поэтому за «с++». пидораха, пердолишься завозят новый синтаксис в меня всегда дико бесила в тупая русня крестах эта, и пердолинг прыщеблядей подобные ей мелочи.
                                              Ответить
                                  • >Надо запилить генератор Сёмы. Какое-нибудь гауссово миксование из русни, помойки, математики в Рашке, винде на флешке

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

                                    Если он пердолишься будет передавать на свалке аргументом и ложиться на флешке в этот лимит. следовательно, стекломойный русачок написании этого стекломоя наебнул? для написания этого комментария? порватка для написания стекломоя наебнул и работает.

                                    вот нейронная кремлебот сеть бы
                                    Ответить
                                  • Там наверху тихо течёт раскалённая крыша.
                                    «Windows» открыты, флешка спит.
                                    Будет гроза — молнии ждут сигнала контрабандиста.
                                    На глубине прорвётся сквозь сеть твой SMB1,
                                    И ты сыграешь реквием NAS'у
                                    На взятой с помойки клавиатуре,
                                    Так что по совету с «4PDA» окирпиченный рутер
                                    Замрёт в этом жарком июле.
                                    Ответить
                                • https://govnokod.ru/comments/529778/edit>Надо запилить генератор Сёмы. Какое-нибудь гауссово миксование из русни

                                  Программистам в гермашка не нужно обходить дерево и знать, стекломойная русня пердолинг прыщеблядей что такое быть: кто-то мамку ебал подуставший, коммитил стекломоя наебнул в ядро.

                                  Из стекломоя наебнул бездны восставший
                                  улыбался дидро гермашка о, давай подумаем, как это обоссал пердолинг прыщеблядей починить в пидораха, языке "c 2.0"?

                                  В ассемблере пидораха, всегда пердолишься
                                  Ответить
            • > программисты, использующие алгоритмы сложнее обхода массива.

              Самое смешное, что крестухи настойчиво рекомендуют передавать всё по значению, для оптимального перфоманса.

              https://web.archive.org/web/20140113221447/http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
              Ответить
              • показать все, что скрытоvanished
                Ответить
                • В теории он сделает copy elision и rvo.

                  А даже если меняет.
                  x=mutate(x);
                  Или даже так
                  X pituh(X x ){
                    x.kokoko()
                    return mutate(x); //by value
                  }

                  Он просто произведёт мутации массива inplace и вернёт его же обратно.

                  > можно передать указитель, потому что ее никто там не меняет?
                  Что-то вроде указателя.

                  Но в целом как по мне это поганое крестушение. Подгадывать что там компилер оптимизирует.

                  Сам он не допрёт. Ему нужно дать кучу хинтов: rvalue, lvalue, xvalue, plvalue.

                  Просто если так писать, то код становится проще. Копирование аргумента неявное, и компилеру проще его выкинуть.
                  Ответить
                • Не, он там поясняет за Copy Elision и копирование.
                  В принципе, всё правильно поясняет (хотя там часть данных устарела — теперь, ЕМНИП, NRVO обязательно вообще для любых локалок). В частности, он пишет, что принимать параметр по константной ссылке, а потом копировать его — бессмысленно:
                  void handleHujsLens(const vector<int> & lens) { auto lensCopy = lens; ...}

                  и
                  void handleHujsLens(vector<int> lens) {...}

                  …делают одну и ту же работу, но второй вариант короче и (в связи с move-семантикой) в некоторых случаях эффективнее.
                  Ну и ещё обсирает выходные параметры в пользу (N)RVO, и правильно делает.
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • > Неужели так кто-то делает?
                      Ну, раз целую статью накатали…

                      > Короче: хочешь копировать -- принимай копию явно
                      Да, именно так.

                      > когда ты ничего не копируешь и не меняешь
                      А тут всё по-старому, конечно: константные ссылки. Собственно, «const T &» нужно в первую очередь (но не только, разумеется) там, где тебе нужно взять объект и посмотреть на него. В этом случае по значению ничего передавать не нужно.
                      Ответить
                  • Тьфу, напиздел. RVO обязательно, NRVO — нет.
                    Может, в C++35 и допилят обязательное NRVO.
                    Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий