Ivan Sokolov
Иногда программе становится так хорошо, что хочется запечатлеть core dump. Умирать при этом ни к чему, как бы хорошо ни было. Извне обычно есть gcore и вообще gdb, а что же изнутри? Всё ещё проще:
if (int pid = fork()) {
waitpid(pid, nullptr, 0);
} else {
std::abort();
}
Упражнения по синтезу персистентных структур данных или неблокирующей сериализации слепков симуляции остаются на дом.
7 · 2.3K · greg
Реализация суффиксного автомата остается в качестве упражнения.
struct bt {
bt* left = nullptr;
bt* right = nullptr;
bt* go(auto... dir) { return (this->*...->*dir); }
};
#include <cassert>
int main() {
bt leaf[4],
inner1(&leaf[0], &leaf[1]),
inner2(&leaf[2], &inner1),
root(&leaf[3], &inner2);
assert(&leaf[0] == root.go(
&bt::right,
&bt::right,
&bt::left));
}
7 · 2.4K · greg
Фотография
нажмите — покажем
нажмите — покажем
За отсутствие постов предъявить админам можно будет завтра на C++ Zero Cost Conf в Москве.
10 · 2.4K · Ivan Sokolov
Оказывается, в C++26 наконец-то будет удобный синтаксис для создания REST-контроллеров.
response add(widget)
post("/widgets");
2 · 2.5K · greg
Фотография
нажмите — покажем
нажмите — покажем
Фотография
нажмите — покажем
нажмите — покажем
Фотография
нажмите — покажем
нажмите — покажем
enum to string в наши дни. дикий enum to string
57 · 6.4K · greg
Мне лень тебе тапл накладывать на цпп и придумывать примеры. ты явно стишком серьёзный для таких дел. Напиши что-то типа таккой рекурсивной чуши:
auto tuple = [](this auto tuple, auto ... xs) {
return [=](auto f) { return tuple(f(xs)...); };
};
int main() {
auto id = [](auto x) { return x; };
auto add = [](auto x) { return [=](auto y) { return x + y; }; };
auto print = [](auto x) { std::print("{}", x); return x; };
tuple(10, 20)(id)(print)(add(10))(print);
}
Сделал максимально по фпешному. Конечно язык не такой убогий мусор, но как смог
11 · 3.1K · greg
Мы долго не выпускали новые авторские посты, потому что готовили proposal. По секрету скажу, что мы близки к принятию его в C++29.
13 · 2.9K · Файл
P1488R0.pdf · 103 КБ · нажмите — покажем
56 · 6.2K · P1488R0.pdf · 103 КБ · нажмите — покажем
greg
Фотография
нажмите — покажем
нажмите — покажем
@ БОЛЬШАЯ ЧАСТЬ ОШИБОК И УЯЗВИМОСТЕЙ ИМЕЮТ ПОД СОБОЙ BUFFER OVERFLOW
@ ДАВАЙТЕ ПЕРЕЙДЕМ НА MEMORY SAFE ЯЗЫК
@ КАЗАЛОСЬ БЫ #антибугурт
*пикрелейтед*
https://blog.cloudflare.com/18-november-2025-outage/
20 · 3.1K · greg
Фотография
нажмите — покажем
нажмите — покажем
Наконец-таки мы додумались до ссылок которые могут быть нулями
https://wg21.link/P2988
44 · 6.4K · Ivan Sokolov
Время пятничного зачилла пришло с запозданием и не в тот паблик.
Надеюсь, все уже знакомы с P2806 do expressions. Я бумагу пока даже не открывал. Поговорим про очевидный прародитель и этого предложения, и похожих конструкций в разных языках. Statement expressions в GNU C позволяют писать compound statement там, где нужен expression. В случае C на этом их описание практически заканчивается.
Итак, тип и значение полученного выражения берётся из последнего statement внутри скобок, если это выражение...
int x = ({
int sum = 0;
for(int i = 1; i <= 10; ++i)
sum += i;
sum;
});
// x = 55
...причём вывод типа похож на ->auto, и на это не повлиять.
int i = 0, &ri = i;
// decltype(({ ri; })) = int
// decltype(({ (int&&)i; })) = int
Guaranteed copy elision работает, но аналога RVO нет.
struct immobile { immobile(); immobile(immobile&&)=delete; };
struct moveonly { moveonly(); moveonly(moveonly&&)=default; };
auto x = ({ immobile(); }); // ok since C++17
auto y = ({ moveonly m; m; }); // error: call to deleted copy ctor
Но то всё мелочи. Сабж выгодно отличается от замыканий возможностью control flow, влияющего на содержащую функцию:
while(1)
while(({ break; // gcc: breaks outer loop
// clang: breaks inner loop
1; }));
goto внутрь делать нельзя, но можно наружу, в том числе вниз:
auto v = ({
goto out;
std::vector<int>();
});
out:
// The usual error "jump crosses initialization of v"
// does NOT happen. v is uninitialized.
// Its destructor will probably crash.
...Если вы ещё не забыли, у нас тот самый пятничный зачилл. Есть малозначительные разногласия по поводу того, где сабж в принципе разрешён.
int i = ({1;}); // error: never ok outside functions
decltype(({1;})) i; // error: ...even in unevaluated context
struct foo {
decltype(({1;})) i;
// error: again, never ok outside functions.
// gcc emits disappointing but correct message
// clang complains about file scope even though it's not
};
int main() {
std:
5 · 839 ·