Вы еще спрашиваете? Конечно переводите. Такое как горячие пирожки разлетится.
PS Интересно, в книге раскрыта тема связи теории категорий с шаблонами С++?
Специально ради вашего поста обновил Clang с 3.2 на
3.4
$ clang -v
Ubuntu clang version 3.4-1ubuntu1 (trunk) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Но во всех примерах получаю: clang: warning: argument unused during compilation: '-Rpass=loop-vectorize'
В примере #4 вы видимо имели ввиду clang++ -O3 -Rpass=loop-vectorize -S test4.cpp -o /dev/null
Нашел баг!!! coliru.stacked-crooked.com/a/d919304815452d35
Все таки не зря encyclopedist с самого начала сказал о проблемах с выравниванием, а я вместо того что бы устранить грабли принялся дебажить изначально дефективный код.
Если кратко, как исправлен баг:
Добавлено
Обязательно. Но вчера я так и не нашел причину. Сложность еще и в том, что «дебажить» приходится в браузере, что весьма необычно для меня. (у меня нет g++-4.9.0, а только g++-4.9.2 и g++-4.8.1)
Сейчас еще раз подумал. Мы же добиваемся такого же поведения, как и при использовании динамического выделения. Так что, запрещенный конструктор копирования и дефолтный конструктор переноса — то что надо. Собственно unique_ptr так и работает.
Таким образом, с копированием/переносом проблем нет.
Ну да assert просто сигнализирует, что не был вызван assign. Который инстацирует объект. Если объект не инстацирован, то падать оно конечно будет т.к. в памяти не то что мы ожидаем. Просто такого там быть не должно. Но в g++-4.9.2 проблема не воспроизводится.
PS
Я бы, только, дополнил Makefile секцией uninstall:
PS Интересно, в книге раскрыта тема связи теории категорий с шаблонами С++?
Ubuntu clang version 3.4-1ubuntu1 (trunk) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu
Thread model: posix
Но во всех примерах получаю:
clang: warning: argument unused during compilation: '-Rpass=loop-vectorize'
В примере #4 вы видимо имели ввиду
clang
++-O3 -Rpass=loop-vectorize -S test4.cpp -o /dev/null
Все таки не зря encyclopedist с самого начала сказал о проблемах с выравниванием, а я вместо того что бы устранить грабли принялся дебажить изначально дефективный код.
Если кратко, как исправлен баг:
Добавлено
т.к. в этой версии gcc, видимо, std::aligned_union уже удален.
заменено на
Таким образом, проблема решилась добавлением выравнивания.
В моем случае можно было поступить и проще. Просто заменить unsigned char mem[usize]; на
Пару вопросов по тексту, если можно.
Я верно понимаю, что в c++14 std::max стало можно использовать в constexpr выражениях?
Почему не reinterpret_cast<T*>(&_storage)? Довольно необычная конструкция прежде ее не видел.
Таким образом, с копированием/переносом проблем нет.