Arseny
А кто-нибудь в курсе, лямбды, которые не копируются в stl уже научились куда-то сохранять?
Vsevolod
да, вот как раз хотел к этой теме привлечь внимание
Vsevolod
семантика копирования будет довольно вредной для таких stack_function
Vsevolod
ну и проблема с кложурами, которые захватывают movable объекты
Vsevolod
вот типа std::unique_ptr
Vsevolod
и все, std::function ломается нафиг
Arseny
Ага. И еще часто такую лябду нельзя вызывать больше одного раза.
Arseny
Потому что она это unique_ptr куда-то передает, например.
Thorn
Vsevolod
выстрелить себе в ногу можно и более простыми способами, чем выкинуть из лямбды куда-то unique_ptr
Arseny
Denis
C import export им норм.
Denis
Или как там этот ужас, я забыл.
Denis
export import?
Arseny
🐙 Antony
🐙 Antony
Как починят SFINAE - вообще красота будет
Constantine
а std::function требует, чтобы функтор был CopyConstructible
Constantine
при этом меня определенно не радует, что у лямбды нельзя поставить operator () &&
Constantine
@antoshkka я даже скинул вам это на stdcpp.ru/proposals
Stanislav
Stanislav
а еще в vcpkg наконец то вмержили модульный буст
Alexander "SonnySlave"
https://godbolt.org/g/3MvQ2B
Alexander "SonnySlave"
кто-нибудь мне пояснит, почему тут такое генерируется?
Egor
Alexander "SonnySlave"
Egor
Это будет некорректная оптимизация
Alexander "SonnySlave"
замени на инты
Egor
Потому что, например, NaN.
Egor
Или +inf
Alexander "SonnySlave"
замени на инты и посмотри
Alexander "SonnySlave"
https://godbolt.org/g/SKHZHA
Alexander "SonnySlave"
переполнение - UB. деление на ноль - низя
Alexander "SonnySlave"
всё, оптимизируй на интах как хочешь
Alexander "SonnySlave"
или я что-то упускаю. в случае даюлов полностью согласен - поэтому про инты и упомянул
Egor
Забавно, что он даже не может 2 * x / x с интами соптимизировать
Egor
Кроме, кстати, trunk'а clang
Egor
2 * (x / x) — пожалуйста (кроме icc 18), x / x + x / x — пожалуйста (кроме него же)
Viacheslav
Egor
Для даблов будет NaN или inf, для интов вроде будет UB (не уверен)
Viacheslav
Если да, то оптимизация в двойку технически меняет поведение.
Egor
Кстати, да
Alexander "SonnySlave"
Alexander "SonnySlave"
либо мы получаем ускорение, либо UB
Egor
Но я скорее подозреваю, что компилятор смотрит на (a * b) / c и решает, что он не имеет права это переписывать в a * (b / c), потому что деление целочисленное. А в случае с даблами, видимо, точно есть проблема с NaN.
Alexander "SonnySlave"
а то, что раньше у тебя было UB, а потом починилось - это не проблемы компилятора
Egor
Да, но если там _гарантируется_ какое-нибудь исключение или поведение...
Alexander "SonnySlave"
Alexander "SonnySlave"
остальное не имеет значения
Egor
Надо сказать, что добавить -funsafe-math-optimizations к шлангу помогает ему догадаться до двойки.
Egor
В случае с интами
Egor
https://andrei600.wordpress.com/2016/03/15/gcc-compiler-options-funsafe-math-optimizations-and-ftracer/
Egor
Это пост про даблы, но с int'ами тоже что-то поменялось.
Alexander "SonnySlave"
Egor
Хм, видимо, обознался
Alexander "SonnySlave"
https://godbolt.org/g/86rjgu
Egor
Кажется, хороший вопрос для StackOverflow
Alexander "SonnySlave"
Alexander "SonnySlave"
а там пацаны расскажут, что да как
Alexander "SonnySlave"
подозрительно, что даже gcc таким не занимается
Александр
x = 0 -> division by zero
Alexander "SonnySlave"
Alexander "SonnySlave"
это UB
Александр
а, ну да
Александр
раз UB, можно запросто возвращать двойку
Alexander "SonnySlave"
x+x >int тоже UB
Александр
это я знаю, а вот насчёт / 0 сомневался
Александр
казалось, что там по стандарту что-то вылетает
Vladislav
есть такой код
void f(int x) {
std::cout << x << " " << double(x) << "\n";
}
В аутпуте 864904920 0
загадка: как такое может быть и с каким аргументом вызвали f?
Vsevolod
0/0 - nan
Александр
вообще там int
Alexander "SonnySlave"
и да, на интах то не отвертишься)
Александр