Constantine
О! Антон. Вам наверняка будет интересно. Нашел очень странный фич оптимизатора вижака
Constantine
https://godbolt.org/g/HUqhpq
Constantine
https://godbolt.org/g/HUqhpq
В этом примере можно заметить, что функция f1 будет сгенерирована безумно плохо при компиляции с /EHsc
Aidar
ох не нравятся мне костыли в языке
Constantine
Constantine
Мораль: чтобы вижак нормально работал, нужно, видимо, не использовать struct-init
🐙 Antony
Если у вас есть учётка, попробуйте отправить им багу.
Aidar
Constantine
Я им отправлю, только проблемы с оптимизацией под /EHsc судя по всему очень давние и какие-то by design
Constantine
при этом /EHsc является основной практической настройкой
Constantine
в данном примере такое ощущение, будто компилятор опасается выброшенного исключения при {} - инициализации структуры с size_t
Aidar
а математически можно заставить компиль распозновать удлинение времени жизни в сложных случаях?
🐙 Antony
Aidar
на объекты бы повесить те же штуки что и на функции
Constantine
в общем, категорически рекомендую добавлять /EHsc при проверке тех или иных решений для msvc
Constantine
потому что может приводить к полному сбою всей оптимизации
Aidar
Aidar
Aidar
слишком жирно
Anatoly
Berkus
да ну его
го писать на го - тупо же звучит, поэтому и не пишет :D
🦥Alex Fails
ага, да и к тому же я ж уже так шутил)
Anatoly
интересно, какой смысл вкладывался. даже если предположить, что сигнатура была до появления std::string_view просто std::string.
Anatoly
ok
Constantine
Constantine
нужно просто нормально написать для всяких std::vector::operator [] ref-quailifier
Aidar
ну вон там стрингвью
Anatoly
@antoshkka так, а прострел ноги в том, что ...? ну, передали в std::string_view временный объект, который будет жить до конца полного выражения. ну передали в функцию. функция же не дура сохранить где-то std::string_view и использовать после.
Constantine
в string_view нужно запретить вообще временные объекты передавать)
Aidar
просто какбы у stringview семантика ссылки неявная
Aidar
и вроде хранить можно изза этого
Constantine
я бы сказал, что в C++ есть чудесная проблема преобразования && в const&
Aidar
Aidar
даже 2 или 3
Constantine
Constantine
const& сигнатура аналогична const
Constantine
operator string_view() noexcept & должно быть
Constantine
string_view это принципиально & тип, насколько я понимаю, он не может захватить владение
Constantine
Т.е. если я создаю или присваиваю view-объект с нарушением правил жизни, я сам буратино
Constantine
Хотя я предпочел бы иметь view-объекты немутабельными
Constantine
Как &
Berkus
Enter Rust
Constantine
Aidar
Aidar
ну там не нужна гарантия
Aidar
давайте оставим как есть
Constantine
Constantine
Ну кроме того, что && конвертируемо языком в const& и это все ломает
Aidar
ну раст +- говорят чекает хотя я не проверял
Aidar
на явных штуках наверное
Constantine
да раст небось заставит тебя доказывать что объект не сдохнет
Berkus
Constantine
Berkus
удобно вот так хейтить то сразу, да?
Constantine
я предполагаю ошибку вроде "I'm not sure this reference is not dead, gimme the prove"
Constantine
Berkus
ну в расте если функция консьюмит этот стринг вью, то bar(foo()) валиден - bar заберет ownership себе и спокойно внутри себя похоронит
Berkus
если не консьюмит то тоже должно быть нормально, не могу сказать точно почему я так думаю сейчас правда
Berkus
а, ну собсно borrow будет на время вызова, а потом дропнется
Constantine
Berkus
если ты передаешь значение то оно консьюмится
Berkus
let a = "foo";
g(&a); // g сжирает &a
f(a); // f сжирает а
h(a); // хуюшки
Berkus
примерно так
Constantine
т.е. g() по сигнатуре получает & и обязана не делать side effect
f(), h() по сигнатуре получает значение и его перемещают
правильно?
Berkus
близко, но не совсем, в с++ нету lifetime annotations
🦥Alex Fails
{}
Constantine
(под side effect подразумеваю что функция не имеет права присваивать ссылку кому-либо, кроме локальных переменных и возвращаемого view-значения)
Constantine
Berkus
в конвенции нет бороу чекера, так что это баловство в целом
Constantine
компиль-тайм чекера нет, да