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

    +11

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    typedef ::boost::array<T, item_amount+1> not_raw_array;
    union data
    {
    	 not_raw_array m_raw_array;//Most members of boost::array not suitable for call with raw array. Be careful!
    };

    Запостил: LispGovno, 27 Марта 2013

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

    • и да, осторожней, детка, в лесу могут быть волки
      Ответить
    • чёзанах
      Ответить
    • Кстати, чуть ниже строчка:
      data m_array;
      Ответить
    • It's dangerous to go alone! Take this.
      Ответить
    • Никто не догадался, поэтому поясню ход мысли автора, так как я посмотрел комментарии ревизии в GIT:
      Это часть контейнера. Автор не использовал not_raw_array напрямую, а завернул его в union, чтобы иметь возможность произвольно создавать и убивать объекты в m_raw_array массиве. Иначе без union в not_raw_array объекты создадутся сами, если имеют нетривиальный конструктор. Может в С++11 оно у автора и работало, но у меня вчера бомбануло, когда я дописал конструктор в структуру (шаблонное T), что хранил в этом контейнере.
      Ответить
      • леденящая душу логика
        ставлю плюс за задумку, тру какир
        Ответить
      • почему бы просто не использовать char[ sizeof(T) * ( item_amount + 1) ] и placement new ?
        Ответить
        • ты что, это же reinterpret_cast делать на operator []!
          Ответить
          • Я слишком устал и зелен, чтобы понять, сарказм это или нет.
            Ответить
            • ну я такого пиздеца еще не видел никогда
              хак окей
              char[...] это, как ни крути, массив чаров, и чтобы получить i-тый T & из него, нужно мало того, что развлекаться с sizeof(T), но и постоянно приводить (char *) к (T *), а (char const *) к (T const *)

              сделал бы я так же, если бы приспичило (тьфу тьфу)? нет, слишком неочевидно - не проссышь без объяснений, что это вообще, в отличие от классического char[...]
              Ответить
              • > развлекаться с sizeof(T)
                > постоянно приводить
                Сколько сарказма в этом предложении... Осторожнее надо быть, читатели ведь и правда могут поверить, что там что-то сложнее пары приватных методов с одним реинтерпрет кастом внутри, да сайзофа при объявлении массива...
                Ответить
                • имхо, геморройней отслеживать, какой объект отконструировался, а какой ещё нет, с bitset<item_amount + 1> возиться на доступе и в деструкторе
                  Ответить
                  • Ну это если контейнер с рандомным созданием-удалением собираем. А если, к примеру, какую-нибудь bounded queue, то там ведь и пары чисел хватит. Если аналог вектора - там вообще одно число - текущий size.
                    Ответить
        • Ты чо, это же скомпилируется в С++03 и не даст почувствовать, какой крутой новый стандарт!
          Ответить
    • Ну приехали... В том контейнере используется std::uninitialized_copy в assign, а он по стандарту не гарантирует даже weak exception safety.
      То есть недоконструированные объекты в случае исключения он не откатит.

      В случае исключения я даже узнать не смогу что успело создаться, а что нет
      Ответить
      • >std::uninitialized_copy в assign
        А ещё в конструкторе и assignment operator

        У меня конечно есть исходники и сейчас поправлю, но противно.
        Что посоветуете взамен std::uninitialized_copy, окромя самописного велосипеда? Может что из буста?
        Ответить

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