TGViewer
this->notes. this->notes. @thisnotes · 4.52K subscribers
Post #138 953
this->notes. #cpp #poll Задача такая: выполнить какой-то код ровно один раз во время жизни нашей программы. Решение вполне понятное: void init() { static bool unused = [] { std::cout << "printed once" << std::endl; return true; }(); } При вызове такой функции…
#cpp #poll

Дисклеймер.
Предвижу, как на меня выливаются вёдра помоев за такой солв, но он интерес
ен чисто с точки зрения языка и приёма, а не как что-то, что стоит юзать в жизни (собственно в оригинальном докладе так и говорится).

Вспомним, как работает этот код:

void init() {
static bool unused = [] {
std::cout << "printed once" << std::endl;
return true;
}();
}


Мы инициализируем статическую переменную. Во-первых, это всегда происходит атомарно (вот такой факт). Во-вторых, только один раз (пруфы на оба утверждения). В-третьих, есть вот такое утверждение:

If the initialization throws an exception, the variable is not considered to be initialized, and initialization will be attempted again the next time control passes through the declaration.

Возникает ужасная идея: поюзать исключения для контроля flow вашего кода (не делайте так пожалуйста). Так что можем сообразить что-то такое:

struct Throwed {};

constexpr int n = 3;

void init() {
try {
static bool unused = [] {
static int called = 0;
std::cout << "123" << std::endl;
if (++called < n) {
throw Throwed{};
}
return true;
}();
} catch (Throwed) {}
}


Как по мне, оч прикона.

Ещё можно найти такой факт:

If the initialization recursively enters the block in which the variable is being initialized, the behavior is undefined.

Никогда не задумывался об этом. Тож интересно.
  • 👍 16
  • ❤ 1
More from @thisnotes
  1. Sep 17, 2026#common Сидите вы себе спокойно, разрабатываете поиск каких-нибудь объектов. Может это тов…
  2. Sep 9, 2026#cpp #books Да, книга 2001ого года. Мы ровесники. И да, в ней в основном обсуждаются какие…
  3. Sep 2, 2026#perf Попробовал собрать в кучку (кажется, немного сумбурно всё же) мысли по двум моментам…
  4. Aug 31, 2026Давайте новый тег заведём: #perf Во-первых, надо понять, что я вообще понимаю под перфом,…
  5. Aug 27, 2026#common Мы часто делаем системы, которые обладают какими-то ограничениями. Ограничения наш…
  6. Aug 24, 2026#list 0. [talk] Achieving Peak Performance for Matrix Multiplication in C++. Aliaksei Sala…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →