Дисклеймер.
Предвижу, как на меня выливаются вёдра помоев за такой солв, но он интересен чисто с точки зрения языка и приёма, а не как что-то, что стоит юзать в жизни (собственно в оригинальном докладе так и говорится). Вспомним, как работает этот код:
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.Никогда не задумывался об этом. Тож интересно.