Roman
Нет, мне это нужно для DSL, в конструкторе некрасиво
🐙 Antony
Потому что в иных случаях компилятор может задискардить запись в const поле и всё.
Скорее компилятор может закешировать чтение из конст поля. Если у вас optional, и в нем вы хрениете struct { const a; }; где a == 7, а потом пишете в optional такую же структуру где a == 9, то чтение a у вас по прежнему может возвращать 7
std::launder нужен для классов, использующих placement new на стеке и умеющих переинициализировать своё хранилище, если в них харнятся константные объекты/субобъекты
Крылатый
Што
🐙 Antony
Как часто возникает такая упячка: в Boost за ~15 лет существования optional и variant не было баг репортов на данную тему. Так что такое случается только на некоторых компиляторах, только при стечении всех необходимых обстоятельств, только если оптиизатор перестарался.
Другими словами - std::launder вам врядли нужен. Главное не писать свои optional и variant
Evgenii
Roman
Это launder реализован через интринзик? Или ещё какая-то С++ магия внутри?
Andrei
Нет, скорее всего просто хитрый аттрибут, который читает компилятор.
🐙 Antony
В GCC он реализован вот так:
#define __cpp_lib_launder 201606
/// Pointer optimization barrier [ptr.launder]
template<typename _Tp>
constexpr _Tp*
launder(_Tp* __p) noexcept
{ return __builtin_launder(__p); }
Roman
ну да, builtin
Roman
в type_traits тоже много компиляторных builtinов
Roman
Т.е. по сути это расширение языка скрытое под видом расширения библиотеки
Andrei
Roman
вообще логично было бы запрещать placement new для констант
Roman
хотя.. нет, в языке где есть const_cast ничего уже не запретишь )
Roman
В Clang смешной код на тему const correctness: латтнер решил что для ссылок и указателей на immutable типы const писать нет смысла
Roman
идею разделили не все
Roman
в результате у них часть API требует использования const_cast
Roman
Почему launder не встроен в placement new по умолчанию?
🐙 Antony
Roman
Интересно, вот есть const_cast, а почему нет private_cast ? Который бы делал поле public :)
Roman
Или предполагается что снимать приватность нужно путем арифметики над указателем на класс?
Dr. Friedrich
И ещё pimpl_cast, который бы позволял определить неопределённые типы!
Matwey
Предлагается не снимать приватность
Egor
const_cast нужен для совместимости с C API (где const не было), а "обратной совместимости с private" при появлении плюсов быть не могло
Dr. Friedrich
Ну, чтоб от нас совсем не было защиты никакой
Dr. Friedrich
Пожалуй, что так.
Roman
pimpl к сожалению слишком сильное заклинание, его не снять никаким кастом
Roman
только дизасемблером
Roman
Roman
Превращаем её в plain old struct кастом и вперед )
Dr. Friedrich
Dr. Friedrich
Чаще всего приходится колдованить с const_cast на строках.
Dr. Friedrich
Я не знаю, как с этим в POSIX, а вот в винапи достаточно функций, которые требуют неконстантных строк, и не модифицируют их потом. Либо приходится делать const_cast, либо копировать строки на каждый чих.
Egor
Dr. Friedrich
Dr. Friedrich
Хотя я уже запутался, что мы обсуждаем :)
Evgenii
🐙 Antony
чтобы не платить если не надо?
Не думаю что за это придётся платить. Если аллокация в динамической памяти, компилятор скорее всего и так не рискнёт оптимизировать, если аалокация на стеке - то launder нужен для константных объектов, иначе он ни на что не влияет.
Стоит забросить идею, а там пусть разработчики компиляторов подумают и решат, вляет ли он на производительность
Evgenii
🐙 Antony
Вот тут длинная бумага с описанием проблемы http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0532r0.pdf
Если появятся желающие побороть проблемы - будет круто!
Evgenii
Vladislav
ttldtor
Как-то она быстро закончилась...
Matwey
🐙 Antony
Закинул убойную идею по оптимизации функций C++ https://stdcpp.ru/proposals
Прошу в коменты, тема весьма животрепещущая :)
🐙 Antony
См "Беспрдельный copy elision"
ttldtor
🐙 Antony
Сейчас поправим...
Anatoly
Сейчас поправим...
и здесь поправь "В C++17 если мы возвращаем субобъект из функции, для него *нефозможно* применить copy elision.": https://stdcpp.ru/proposals/f2b10c13-15b7-4780-83e1-79c7fea0c9cf
🐙 Antony
done
🦥Alex Fails
Vladislav
52 метра?
Ага, ассоциация первого уровня
ttldtor
а когда уже constexpr будет по-умолчанию?...
Matwey
только он не в стандарте, как я понял
Точно, давайте внесем число пи в стандарт. Ошибемся в какой-нибудь цифре и потом будем думать, как нам это исправить не ломая совместимость.
Dr. Friedrich
Vladislav
Igor
так и вижу в логе коммитов "fix PI value"
Berkus
Berkus
vladislav
метапрограмминг низзя вроде
Berkus
🦥Alex Fails
vladislav
На самом деле, да. Шаблоны это то, чего не хватает Rust, а так, отличный язык, готовая экосистема, пакетник, брутальный синтаксис.
Berkus
метапрограмминг низзя вроде
там оказывается что упоротый метапрограмминг нинужен, а сделать можно понятней, сопровождаемей и достачно красиво
Anatoly
+ 😢
можно договорится о теге типа #meetup, по которому ты сможешь собирать автоматом инфу о встречах
Berkus
хотя некоторых компайл-тайм фишек и не хватает
vladislav
🦥Alex Fails
🦥Alex Fails
Anonymous
🦥Alex Fails
?
github.com/procxx/kepka
🦥Alex Fails
Berkus
Dr. Friedrich
Anonymous
А насколько кепка отстаёт от главной репы?
Крылатый
Это основная репа отстаёт от Кепки!
Constantine