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
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
Т.е. по сути это расширение языка скрытое под видом расширения библиотеки
Roman
вообще логично было бы запрещать placement new для констант
Roman
хотя.. нет, в языке где есть const_cast ничего уже не запретишь )
Roman
В Clang смешной код на тему const correctness: латтнер решил что для ссылок и указателей на immutable типы const писать нет смысла
Roman
идею разделили не все
Roman
в результате у них часть API требует использования const_cast
Roman
Почему launder не встроен в placement new по умолчанию?
🐙 Antony
Почему launder не встроен в placement new по умолчанию?
выглядит как хорошая идея для proposal
Roman
Интересно, вот есть const_cast, а почему нет private_cast ? Который бы делал поле public :)
Roman
Или предполагается что снимать приватность нужно путем арифметики над указателем на класс?
Dr. Friedrich
И ещё pimpl_cast, который бы позволял определить неопределённые типы!
Matwey
Предлагается не снимать приватность
Egor
const_cast нужен для совместимости с C API (где const не было), а "обратной совместимости с private" при появлении плюсов быть не могло
Dr. Friedrich
Ну, чтоб от нас совсем не было защиты никакой
Matwey
Ну, чтоб от нас совсем не было защиты никакой
А от нас и так нет. Мы всё равно здесь всё перевернём!
Dr. Friedrich
Пожалуй, что так.
Roman
pimpl к сожалению слишком сильное заклинание, его не снять никаким кастом
Roman
только дизасемблером
Roman
Превращаем её в plain old struct кастом и вперед )
Dr. Friedrich
А как С++ класс передавать в Сишную функцию ;) ?
Не только же к классам это применимо.
Dr. Friedrich
Чаще всего приходится колдованить с const_cast на строках.
Dr. Friedrich
Я не знаю, как с этим в POSIX, а вот в винапи достаточно функций, которые требуют неконстантных строк, и не модифицируют их потом. Либо приходится делать const_cast, либо копировать строки на каждый чих.
Egor
А как С++ класс передавать в Сишную функцию ;) ?
Можно без кастов неявно в void* и вперёд
Dr. Friedrich
Можно без кастов неявно в void* и вперёд
Неявно константа не скастуется же.
Dr. Friedrich
Хотя я уже запутался, что мы обсуждаем :)
Evgenii
🐙 Antony
чтобы не платить если не надо?
Не думаю что за это придётся платить. Если аллокация в динамической памяти, компилятор скорее всего и так не рискнёт оптимизировать, если аалокация на стеке - то launder нужен для константных объектов, иначе он ни на что не влияет. Стоит забросить идею, а там пусть разработчики компиляторов подумают и решат, вляет ли он на производительность
🐙 Antony
Вот тут длинная бумага с описанием проблемы http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0532r0.pdf Если появятся желающие побороть проблемы - будет круто!
ttldtor
Как-то она быстро закончилась...
🐙 Antony
Закинул убойную идею по оптимизации функций C++ https://stdcpp.ru/proposals Прошу в коменты, тема весьма животрепещущая :)
🐙 Antony
См "Беспрдельный copy elision"
ttldtor
Закинул убойную идею по оптимизации функций C++ https://stdcpp.ru/proposals Прошу в коменты, тема весьма животрепещущая :)
Спешил очень? Идея классная, но "код превратиться", "тукщей функции" режут глаза =)
🐙 Antony
Сейчас поправим...
Anatoly
Сейчас поправим...
и здесь поправь "В C++17 если мы возвращаем субобъект из функции, для него *нефозможно* применить copy elision.": https://stdcpp.ru/proposals/f2b10c13-15b7-4780-83e1-79c7fea0c9cf
🐙 Antony
done
🦥Alex Fails
только acos так не умеет
Скоро научится
Vladislav
52 метра?
Ага, ассоциация первого уровня
ttldtor
а когда уже constexpr будет по-умолчанию?...
Matwey
только он не в стандарте, как я понял
Точно, давайте внесем число пи в стандарт. Ошибемся в какой-нибудь цифре и потом будем думать, как нам это исправить не ломая совместимость.
Igor
так и вижу в логе коммитов "fix PI value"
Berkus
сделать проверку индекса ничего не стоит
стоит как минимум пять команд, а с выводом ошибки и больше
vladislav
метапрограмминг низзя вроде
Berkus
Т.е. это просто всё равно что генерить код скриптом на питоне. Или я не прав?
да, до шаблонов не дотягивает, но по факту вполне достаточно
vladislav
На самом деле, да. Шаблоны это то, чего не хватает Rust, а так, отличный язык, готовая экосистема, пакетник, брутальный синтаксис.
Berkus
метапрограмминг низзя вроде
там оказывается что упоротый метапрограмминг нинужен, а сделать можно понятней, сопровождаемей и достачно красиво
Anatoly
+ 😢
можно договорится о теге типа #meetup, по которому ты сможешь собирать автоматом инфу о встречах
Berkus
хотя некоторых компайл-тайм фишек и не хватает
🦥Alex Fails
?
Надо собирать кепку!
ttldtor
Надо собирать кепку!
Она проще собирается чем официальный клиент?
🦥Alex Fails
?
github.com/procxx/kepka
🦥Alex Fails
Она проще собирается чем официальный клиент?
Д. Основная цель - упростить сборку
Anonymous
А насколько кепка отстаёт от главной репы?
Крылатый
Это основная репа отстаёт от Кепки!
Constantine
Интересно, вот есть const_cast, а почему нет private_cast ? Который бы делал поле public :)
Потому что const_cast нужен для поддержки не const-correct легаси кода)