Кресты / Говнокод #11942 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 LispGovno, (Updated )

Комментарии (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 лет жили без локальных функций, и еще бы столько же прожили
            делаю скидку лишь на то, что это не продакшен код, а так, поиграться в свое удовольствие, т.е. премия не под ударом
            Ответить
            • >захватом чужих автоматических переменных
              рейдеры в топике
              Ответить
            • >с++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
      Мой код проще. К тому же это не эквивалентный код. У меня создается локальный объект (потокобезопасно), а у вас глобальная переменная static int x = 0;
      Ответить
  • Решил подучить кресты, читаю книжку александреску. Наличие в чисто императивном языке чисто функционального подъязыка крестошаблонов с паттерн-матчингом и рекурсией приятно удивило. Теперь, кажется, я начинаю понимать, почему некоторые люди любят кресты, хоть я пока и не разделяю их чувств.
    Ответить
    • В крестах очень няшное метапогроммирование. Лучше только в D и темболее Nemerle. Притом в последнем более низкоуровневое, но 100ни раз мощнее. Про Template Haskell ничего не скажу, ибо не знаю.
      Ответить
      • Конечно же я про метапрограммирование только на статическитипизированных языках говорю.
        Метапрограмммирование мощнее, чем в динамически типизированном языке - быть не может.
        Ответить
    • >крестошаблонов с паттерн-матчингом
      А вот не правда: Рекурсия не возможна в паттернматчинге. В паттернматчинге не возможен даже такой вывод:
      TClass<T&,T>::
      А объяснение очень простое: Это не паттернматчинг, а алгоритм унификации.
      Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8