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

    +3

    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
    template <typename T>
    void f() {
         if constexpr (std::is_arithmetic_v<T>)
             // ...
         else
           static_assert(false, "Must be arithmetic"); // ill-formed: invalid for every T
    }
    
    // The common workaround for such a catch-all statement is a type-dependent expression that is always false:
    template<class T> struct dependent_false : std::false_type {};
    template <typename T>
    void f() {
         if constexpr (std::is_arithmetic_v<T>)
             // ...
         else
           static_assert(dependent_false<T>::value, "Must be arithmetic"); // ok
    }

    То есть «static_assert(false)» в шаблоне — это UB. Чтобы оно было не UB и можно было спокойно отключать ненужные специализации — надо городить ёбанный костыль. Пиздец. Почему стандартизаторы не могут просто взять и сделать что-то удобное? Что-то, для чего не требуется городить по десятку костылешаблонов, заставляющих его работать? Что-то без ёбанной явной специализации для bool? Почему любой высер крестокомитета обязательно должен быть максимально сложным, вербозным, неочевидным говном с кучей подводных камней и UB?

    Запостил: gost, 06 Января 2020

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

    • Зачем кресты такое говно?
      Ответить
      • Традиция делать не так, как программистам на «C++» будет удобно, а так, как получилось. Сначала кто-то из Комитета пишет reference implementation, потом под него подгоняют стандарт.
        Ответить
    • Хрюкни.
      Ответить
    • Скоро из крестов нахуй уберут рантайм (за ненадобностью) и всё будет выполняться исключительно в компайл-тайме. И крестоконпелятор превратится в жутко тормозной интерпретатор-шаблонизатор. Как "РНР".
      Ответить
      • Мы тратим уйму времени на написание текстов, повторяя буквы, которые в слове уже есть. Нужо стремися к миналстчо.
        Ответить
      • Толсто, столманн.
        Ответить
    • >That's because the condition does not depend in any way on the template parameters. Therefore, the compiler can evaluate it even before instantiating that template, and produces the associated compilation error message if it the evaluation yields false.

      Нихуя не понял на этом сайте https://stackoverflow.com/questions/14637356/static-assert-fails-compilation-even-though-template-function-is-called-nowhere
      Получается в с++ есть просто константные выражения, а есть константные выражения которые вычисляются еще раньше?
      Ответить
      • Есть же constexpr который уже готов изнасиловать тебя и твою собаку своей неудобностью
        Ответить
    • А потом конпелятор догадается, что dependent_false<T>::value ложно для любого T...

      З.Ы. Почему просто не написать static_assert(std::is_arithmetic_v<T>, "Must be arithmetic") без всяких там constexpr if'ов?
      Ответить
      • А потом анимешник в твоём лице догадается, что на сайте govnokod.ru ему не рады, и собрав в кулак остатки мужского начала наконец съебнёт в туман.
        Ответить
        • how dare you to insult Asuka
          Ответить
          • Это Эрис а не Аска.
            Ответить
            • А я думал, что это Хор(л)о…
              Ответить
            • Какой тайтл?
              Ответить
              • «Asobi ni Iku yo!»
                Ответить
                • Гаремник... Через месяц думаю развязаться и снова нырнуть по уши в говно 2D мирок. Как знать, может и такое закатит после годичного перерыва.
                  Ответить
            • ты для меня всегда будешь ассоциироваться со скриншотом у доски
              Ответить
            • Борманд, твоя квартира?
              https://i.imgur.com/TM58HLT.png
              Ответить
              • Какой дианон )))

                Я в круги давно не играл толком, на самом деле. Изредка захожу по фану старые мапки вспомнить...
                Ответить
                • http://earsfingers.ru/kvarto-kvintovyj-krug-bystryj-sposob-vyuchit-tonalnosti/
                  Ответить
              • Похоже на мою, только у меня на полу всякого говна меньше.
                Ответить
                • Заведи козу.
                  Ответить
                  • Коза- это крайний вариант, пригодный для выходцев из Кавказа.
                    Парня бы себе лучше завёл.
                    Ответить
              • Какой уютный кабинет. А у меня кругом хлам, который мешает работе.
                Ответить
                • Хрюкни.
                  Ответить
                  • Стоит также отмечалий, что целесообрался развития системы масштабного скрыления ряда багров направлений развития питушни.
                    Ответить
      • Ага, и надо будет придумывать ещё больше тупых костылей, ведь это так весело!

        Тут можно написать, да, но это просто пример такого поведения. У меня в калькуляторе был более сложный случай:
        template<typename Lhs, typename T>
        struct Fold_t<Div<Lhs, Const<T, 0>>> {
            static constexpr int raise()
            {
                return 1 / (sizeof(T) - sizeof(T));
            }
            static constexpr int raiseError = raise();
        };

        Сюда бы идеально подошло static_assert(false), но увы, приходится городить тупые костыли. Собственно, я об этом поведении только вчера и узнал, поэтому и наговнокодил такой вот багор.
        Кстати, если этой специализации не делать — получается UB, и в «Visual Studio», например, успешно конпелируется деление на 0 (получается 0).
        Ответить
        • не перебивай, что за нневоспитанность?
          Ответить

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