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

    +22

    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
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    #include <iostream>
    
    using namespace std;
    
    auto fw(int i)->bool
    {
       return cout<<"Привет станция мир"<<i<<"!"<<endl, true;
    }
    
    auto ff()->bool
    {
       return cout<<"Это должно быть последние выполненное подвыражение."<<endl, false;
    }
    auto ft()->bool
    {
       return cout<<"Хьюстон, у нас КРЕСТОПРОБЛЕМЫ. Нарушен порядок вычисления и ленивость логических операторов. Мы падаем!!!!1111"<<endl, true;
    }
    
    struct TBabylonBug
    {
       bool a=true;
       TBabylonBug(){}
       TBabylonBug(bool a):a(a){}
       const TBabylonBug operator&&(const bool ophui) const 
       {
          return a&&ophui;
       }
       const TBabylonBug operator&&(const TBabylonBug& ophui) const 
       {
          return a&&ophui.a;
       }
    };
    
    int main() {
       cout<<"кo"<<endl;
       true&&fw(1)&&fw(2)&&ff()&&ft();
       cout<<"кo ко"<<endl;
       cout<<"TBabylonBug().a = "<<boolalpha<<TBabylonBug().a<<endl;
       TBabylonBug()&&fw(1)&&fw(2)&&ff()&&ft();
       cout<<"кo ко ко"<<endl;
       return 0;
    }

    http://liveworkspace.org/code/efffb5204b0f69a2725b7d9f4ba0d570

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

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

    • Для неспециалиста по сортам говна, можно расшифровку смысла бага?
      Ответить
      • Невозможность никаким образом добиться перегрузкой операторов поведения оригинальных операторов языка. Нарушается семантика операторов. Особенно плохо это сказывается на логических операторах. Нарушается не только порядок вычисления выражений в операторах (что вкупе с побочными эффектами становиться весьма непредсказуемо), но и ленивость логических операторов языка (что из-за побочных эффектов при вычислении выражений может приводить к ещё более веселым последствиям).
        Ответить
        • Типичный пример использования лени операторов некоторыми надмозгами:
          TClass*** a
          //...
          if(a&&*a&&**a&&***a.method1()){
          Вместо TClass*** может быть какой-нибудь умный указатель на умный указатель и тд или boost::optional или ещё какая-нибудь обертка.
          Понятно, что после перегрузки операторов лень и порядок вычисления внезапно сломается. Например ***a.method1() вызовется первым.
          Ответить
          • А зачем перегружать && для умного указателя?
            Ответить
    • Если мне не изменяет память, ленивость и порядок вычислений гарантированы только для встроенных в язык операторов, но не гарантируются для самопальных перегрузок.

      P.S. Лень открывать стандарт, сделайте это за меня, будьте добры.
      Ответить
      • Стандарт не открывал, но всё именно так, как вы сказали. Об этом вроде Герб Саттер в какой-то из своих книг писал.
        Ответить
        • Тут еще в чем проблема - перегруженный оператор это обычная функция, а в с++ невозможно описать функцию с ленивым вычислением аргумента (иначе получился бы хаскель). Именно по этой причине все кастомные операторы не имеют ленивости.

          > Вместо TClass*** может быть какой-нибудь умный указатель на умный указатель и тд или boost::optional или ещё какая-нибудь обертка.
          Зачем в этой обертке перекрыли &&? Перегрузки каста в бул вполне хватило бы, и код бы работал без проблем.
          Ответить
          • >> (иначе получился бы хаскель)

            иначе получился бы D.
            Ответить
            • А как там эту проблему обошли?
              Ответить
              • Там есть lazy для параметров функций.
                http://dlang.org/lazy-evaluation.html
                Ответить
                • На счет лэззи знаю и догадывался. Но на всякий случай удостоверился, что обошли именно за счет него.
                  Ответить
    • — Земля! Земля! Говорит космонавт Хабибулин! Я забыл свои позывные! Земля! Ответьте, какие мои позывные?
      — Мудак ты, Хабибулин, но сейчас ты Сокол!
      Ответить
    • >op hui
      Ответить

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