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

    +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
    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
    // Non-constant constant-expressions in C++
    // http://b.atch.se/posts/non-constant-constant-expressions/
    // The Implementation
    
    constexpr int flag (int);
    
    template<class Tag>
    struct writer {
      friend constexpr int flag (Tag) {
        return 0;
      }
    };
    
    template<bool B, class Tag = int>
    struct dependent_writer : writer<Tag> { };
    
    template<
      bool B = noexcept (flag (0)),
      int    =   sizeof (dependent_writer<B>)
    >
    constexpr int f () {
      return B;
    }
    
    int main () {
      constexpr int a = f ();
      constexpr int b = f ();
    
      static_assert (a != b, "fail");
    }

    Note: clang incorrectly shows the wrong behavior, a workaround is available in the appendix.

    Запостил: j123123, 26 Июля 2018

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

    • http://b.atch.se/posts/constexpr-counter/
      How to implement a constant-expression counter in C++
      Ответить
    • Для template-constexpr-метапрограммистов на C++ наверняка уготован специальный ад, в котором пытки будут начинаться на этапе компиляции в очереди на поступление в runtime-ад.
      Ответить
      • Для них ад начался уже при жизни, прямо во время написания этой метушни.
        Ответить
    • ЕБАТЬ МЕНЯ В ЖОПУ
      как вы это говно понимаете?
      Ответить
    • Переведи на "PHP".
      Ответить
      • function f()
        {
            static $ctr = 0;
            return $ctr++;
        }
        
        function main()
        {
            $a = f();
            $b = f();
            if ($a == $b)
            {
                echo "Ошибка компиляции: fail";
            }
            else
            {
                echo "Компиляция успешно завершена.";
            }
        }
        main();
        Ответить

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