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

    −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
    template< class T >
    T* addressof(T& arg) 
    {
        return reinterpret_cast<T*>(
                   &const_cast<char&>(
                      reinterpret_cast<const volatile char&>(arg)));
    }
    ...
    
     
    template<class T>
    struct Ptr {
    ...
        T** operator&() { return &data; }
    };
    
    int main() {
        Ptr<int> p(new int(42));
        f(&p);                 // calls int** overload
        f(std::addressof(p));  // calls Ptr<int>* overload, (= this)
    }

    Obtains the actual address of the object or function arg, even in presence of overloaded operator&
    http://en.cppreference.com/w/cpp/memory/addressof

    WTF?

    Запостил: myaut, 04 Октября 2016

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

    • Что не так?
      Ответить
      • Возможность перегрузки оператора & и функция чтобы обойти это через два reinterpret_cast
        Ответить
        • Это говно, но ему уже 20 лет и все про него знают. Плохой говнокод.
          Ответить
          • я не знал.

            эти извраты выглядят как если бы кто-то разложил в проекте граблей, перекрыв оператор &. а потом кому-то еще это показалось не достаточным, и он под этими граблями еще и мин позакапывал.
            Ответить
            • Комитет разложил граблей в стандарте, разрешив перегружать амперсанд и запятую, а потом разрабам буста показалось недостаточно, и они решили это еще и поддержать.
              Ответить
              • да, с++ предоставляет и веревку что бы повесится, и ружье что бы в ногу выстрелить, и граблей что бы наступить.

                но в конце это все таки разрабы которые решают этим всем говно пользоватся...

                ... по личному опыту, в 99% случаев, этим народ пользуется только потому что не достаточно умные/опытные что бы додуматся до нормального человеческого решения. или религия с дезайном не позволяет.
                Ответить
                • >не достаточно умные/опытные
                  Это и есть главпроблема цпп?
                  Ответить
    • Кадыр Рамзанов какой-то
      Ответить
    • А что вы ещё хотели от C++?
      Ответить
      • игры я делать хотел блядь
        Ответить
        • А я хотел делать мощные дистрибутед системз. Твоя мечта сбылась? Моя вот нет.
          Ответить
    • Зачем перегрузил пример использованием template?
      Ответить
    • Зачем здесь volatile?
      Ответить
      • Т.е. конст не смущает, а волатайл смущает? Они там для одного и того же - чтобы в случае если T константный или волатильный, не снимать квалификаторы реинтерпрет кастом.
        Ответить
        • Спасибо. Хорошо когда сам у себя спрашиваешь, и сам себе отвечаешь.
          Ответить
    • Я не знаток C++, но некоторые пендорасты говорили что нельзя кастовать int* в char*, т.к. там выравнивание по 4 байта. Или наоборот?
      Ответить
    • Нахуя придуманы все эти виды кастов? Один хуй это эквивалентно сишному (hui*)pizda. Или нет?
      Ответить
      • Ну у них возможности более ограничены. Сишным кастом ты можешь случайно снять константность там, где хотел просто войд звездочку скастить. Со статик_кастом такой конфуз не случится. Т.е. вероятность отстрелить ногу меньше, а читаемость кода больше.
        Ответить
        • Понятно.

          А правда что сишный void* используется для тех же целей что и object в Java и C#? (передать кусок похуй чего в функцию)
          Ответить
          • void* в сишке — это нетипизированный адрес, просто число, адресующее ячейку памяти. С ним мало что можно следать — по сути, только копировать и сравнивать на равенство с другим адресом. Он используется в основном там, где нужно хранить адрес чего угодно. Например, можно так запилить "generic" структуры данных, которые не хранят объекты по значению, только ими будет довольно неудобно пользоваться из-за необходимости кастов и ручного управления памятью.

            Object в Java/C# — это больше, чем адрес. Он знает, какого он типа, его можно сравнить на глубое равенство с любым другим объектом и делать с ним другие непотребства. Например, использовать как мутекс. В жабе Object до сих пор используется для реализации конейнеров, но напрямую в интерфейсах он редко встречается.
            Ответить
          • В том числе для этого.
            Ответить
          • Кстати, dynamic_cast еще и тип в рантайме проверяет, т.е. не эквивалентен сишному касту.
            Ответить

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