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

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    enum class NodeFlags : int {
        None               = 0,
        Let                = 1 << 0,
    // ...
    }
    
    contextFlags &= ~flag;
    
    // error C2675: unary '~': 'NodeFlags' does not define this operator or a conversion to a type acceptable to the predefined operator

    Кому нужны такие гавно-компиляторы? которые даже не в состоянии привети четко прописанные типы?

    Запостил: ASD_77, 20 Марта 2021

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

    • А если в int сделать явный каст, то что будет? Мне кажется, что тут все правильно и логично. Ты же используешь enum class, а их используют, когда не хотят, чтобы питух оттуда случайно привёлся к инту, т.к. для них это запрещено законом стандартом.
      Ответить
      • если сделать то работает но для этого я и унаследовал от инт
        Ответить
    • вероятно, ты хотев простой енум, не класс
      Ответить
      • ну я же четко сказал что enum типа int ... значит кастуй в инт если не знаешь что делать.
        Ответить
        • > значит кастуй в инт если не знаешь что делать

          В каком месте стандарта это написано? enum class -- это примерно как класс, внутри которого есть поле с int'ом.
          Ответить
          • так он на стандарт бухтит, как я понял
            ему не по нраву, что стандарт такое не разрешает
            Ответить
            • Странно, фича, введённая из-за жалоб на проблемы с неявными преобразованиями энумов, не разрешает неявные преобразования. Неожиданно.
              Ответить
          • class Derived : public Base. легко кастуется автоматом в Base. почему enum class XXX : int. не кастуется в int? что за особые условия. если бы я хотел что бы это был некастуемый класс то я бы не указывал int в наследовании.
            Ответить
            • > что за особые условия

              Ты public не написал, а в приватного предка нельзя кастовать.
              Ответить
              • а в скриптоговне можно занаследоваться от инта, кстати
                Ответить
                • Зачем? Зачем?

                  Кстати, вопрос про LSP со звездочкой: int наследуется от float или float от int?
                  Ответить
                  • Float это два int, так что от int наследуется float.
                    Ответить
                    • А поинтер скорее всего это несколько чаров. Значит ли это, что поинтер наследуется от чара?

                      Кстати, никакой гарантии про соотношение размера инта и флота, в общем, нет.
                      Ответить
                  • >Зачем?
                    скотптоговно, ну

                    >I'm interested in subclassing the built-in int type in Python
                    https://stackoverflow.com/questions/3238350/subclassing-int-in-python

                    > int наследуется от float или float от int?
                    Ни то, ни другое.

                    В руби (весьма ООПнутой скриптшуне) у них есть общий предок: Numeric или как-то так.
                    Ответить
                    • Ну иммутабельный инт в качестве флоата вполне норм зайдёт, имхо.
                      Ответить
                      • ну такое.

                        Алгоритм -- псевдокот
                        a:T = 0.05
                        assert round(a * 2, digitsAfterDot=1) == 0.1

                        запустим его для T = float и для T = int
                        Упал LSP?
                        Ответить
                        • А LSP для дженериков вообще применим?

                          Он же про подстановку инстанса, а не типа?
                          Ответить
                          • обобщенное программирование лишь способ реализации полиморфизма, о котором говорит LSP

                            не хочешь генерики, давай без них

                            пусть есть

                            int extends float

                            a:int = 13
                            b:int = 2
                            assert a / b == 6

                            а если там флоат?

                            и наоборот

                            a:float = 0.05
                            assert round(a * 2, digitsAfterDot=1) == 0.1

                            а если там int?
                            Ответить
                      • Целое число большее 2^53 во флоат может ня влезть.
                        Ответить
                        • Всё там влезает, помнётся немножко разве что.
                          Ответить
                          • Неприлично такое говорить дамам (они, кстати, тоже читают говнокод).
                            Ответить
                          • Звучит как очередная порнуха на порнхабе
                            Ответить
            • Барбара Лискоу просит передать комитетчикам, что их enum class -- говно
              Ответить
        • Не, ты сказал, что это класс, отдалённо похожий на энум, с интом внутри. Если хочешт просто энум, то пиши просто enum pitux : int { ... }
          Ответить
          • Один хрен часть операторов не заработает. Тлен и безысходность.
            Ответить
      • вот он же говорит "or a conversion to a type acceptable to the predefined operator" но там четко есть int
        Ответить

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