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

    +33

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    std::function<int()> gl()
    {
       int a=0;
       return [=]()mutable{return a++;};
    }
    
    int main() 
    {
       auto a=gl();
       cout 
          <<a()
          <<endl
          <<a()
          <<endl
          <<a()
          <<endl
          <<a();
       return 0;
    }

    http://liveworkspace.org/code/22012a32e91743cd7357c86930df4b9c

    Не совсем гавно, но порядок выполнения операторов вывода C++ для меня оказался неожиданным и не интуитивным.

    Запостил: LispGovno, 17 Октября 2012

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

    • Если кому интересно, то локальные функции в С++03 при захвате по значению:
      http://liveworkspace.org/code/441e8526a26e2b0cf8842ac4f2f92923
      #include <iostream>
      #include <functional>
      #include <boost/local_function.hpp>
      
      using namespace std;
      
      std::function<int()> gl()
      {
         int a=0;
         int BOOST_LOCAL_FUNCTION(bind a) {
           return a++;
         } BOOST_LOCAL_FUNCTION_NAME(funct)
         return funct;
      }
      
      int main() 
      {
         auto a=gl();
         cout 
            <<a()
            <<endl
            <<a()
            <<endl
            <<a()
            <<endl
            <<a();
         return 0;
      }

      Результат конечно же неимоверно радует:
      -1079077344
      -1079077344
      -1079077344
      -1079077344
      Думаю этот говнокод в одном из следующих бустов пофиксят.
      Ответить
      • Меня на самом деле вот это расстроило, а не оператор вывода. Я то локальными функциями пользовался С++03. :(
        Ответить
        • зачем?
          Ответить
          • Тебя интересует, зачем нужны безымянные и локальные функции?
            Ответить
            • нет, это несколько опрометчиво в с++03 - особенно вышеприведенный крестоблядский пиздец с захватом чужих автоматических переменных
              10 лет жили без локальных функций, и еще бы столько же прожили
              делаю скидку лишь на то, что это не продакшен код, а так, поиграться в свое удовольствие, т.е. премия не под ударом
              Ответить
              • >захватом чужих автоматических переменных
                рейдеры в топике
                Ответить
                • Рейдеры с крестами - коцреарх перилл.
                  Ответить
                  • термин "крестоблядство" сейчас выходит из узкого круга программистов в широкие массы
                    Ответить
                    • да, весь пьедестал в гугле по этому ключевому слову - достаточное условие для бессрочного закрытия уютненького по первой же жалобе из ЗАО РПЦ
                      Ответить
                      • Тараса и посодить могут. Ведь его стараниями на гкоде оно и прижилось.
                        А за популяризацию языка Ада накинут.
                        Ответить
                      • Причем в первой и третьей ссылках гугл процитировал мои комменты ;( Так что меня тоже вычислят и посадят, как злостного крестоблядененавистника.
                        Ответить

                        • http://www.google.ru/search?q=крестобляди
                          http://www.google.ru/search?q=кресто+блядство

                          Отставить панику.
                          Ответить
                          • Ждем пока гугл будет на запрос "крестобляди" писать "возможно вы имели в виду крестоблядство". ;)
                            Ответить
                            • Зато:
                              По запросу крестоблядун ничего не найдено.
                              Ответить
                              • надо правильно искать http://goo.gl/nLhzU
                                Ответить
                                • лол.
                                  а я-то думал мой пост уже проиндексировало.
                                  Ответить
                                  • >а я-то думал мой пост уже проиндексировало.
                                    уже:)
                                    Ответить
              • >с++03 - особенно вышеприведенный крестоблядский пиздец с захватом чужих автоматических переменных
                Тут переменные по документации должны захватываться по значению. Поэтому они уже становиться не автоматическими и должны были выжить после выхода из функции.
                Если хочется захватить переменную по ссылке, то делается так:
                int BOOST_LOCAL_FUNCTION(const bind& a) {
                или
                int BOOST_LOCAL_FUNCTION(bind& a) {
                В таком случае она действительно умерла бы автоматически и ссылка оказалась бы в невалидном состоянии по выходу из функции.
                Ответить
              • >10 лет жили без локальных функций, и еще бы столько же прожили
                Локальные функции в С++03 написали как замену лямбд(безымянных функций). Оно конечно не так удобно, но хоть что-то.
                Ответить
              • >10 лет жили без локальных функций, и еще бы столько же прожили
                Зачем мне энергосберегающая лампочка? 10 лет жили со свечами, и еще бы столько же прожили.
                Ответить
              • > 10 лет жили без локальных функций, и еще бы столько же прожили
                Taras.AssParallel().Summon();

                Будем надеятся, что не кинет исключение.
                Ответить
    • Зачем эти навороты с лямбдами? Достаточно любой функции с побочными эффектами:
      http://ideone.com/V33To
      Аргументы вычисляются справа налево, сдвиг применяется слева направо... Мда.
      Ответить
      • > Аргументы вычисляются справа налево, сдвиг применяется слева направо
        Потому что
        operator <<(operator <<(operator <<(a, b), c), d);
        Ответить
        • >operator <<(a, b)
          Кстати, гарантия порядка вычисления аргументов перегруженного оператора есть? Гарантии порядка вычисления аргументов функции вроде нет.
          Ответить
      • > Зачем эти навороты с лямбдами?
        > http://ideone.com/V33To
        Зачем эти навороты со строками?
        И магическую тройку убрать!
        size_t size = sizeof(words)/sizeof(char*);
        Ответить
      • > Зачем эти навороты с лямбдами?
        > http://ideone.com/V33To
        Спасибо, что поправил мой продакшн-код.
        Ответить
        • надо ещё ревизию и замкнуть этот круг :)
          Ответить
      • > http://ideone.com/V33To
        Мой код проще. К тому же это не эквивалентный код. У меня создается локальный объект (потокобезопасно), а у вас глобальная переменная static int x = 0;
        Ответить
    • Решил подучить кресты, читаю книжку александреску. Наличие в чисто императивном языке чисто функционального подъязыка крестошаблонов с паттерн-матчингом и рекурсией приятно удивило. Теперь, кажется, я начинаю понимать, почему некоторые люди любят кресты, хоть я пока и не разделяю их чувств.
      Ответить
      • В крестах очень няшное метапогроммирование. Лучше только в D и темболее Nemerle. Притом в последнем более низкоуровневое, но 100ни раз мощнее. Про Template Haskell ничего не скажу, ибо не знаю.
        Ответить
        • Конечно же я про метапрограммирование только на статическитипизированных языках говорю.
          Метапрограмммирование мощнее, чем в динамически типизированном языке - быть не может.
          Ответить
      • >крестошаблонов с паттерн-матчингом
        А вот не правда: Рекурсия не возможна в паттернматчинге. В паттернматчинге не возможен даже такой вывод:
        TClass<T&,T>::
        А объяснение очень простое: Это не паттернматчинг, а алгоритм унификации.
        Ответить

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