#include enum HANDLE_STATE { HANDLE_CREAT, HANDLE_DESTR }; struct Meaning { int a; int b; }; static inline void Meaning_lifetime_handler(enum HANDLE_STATE state, struct Meaning *this, void *data) { if(state == HANDLE_CREAT) { this->a = *(int*) data; this->b = 2; } else { printf("%d\n", this->a + this->b); } } int main() { int initializer = 40; [[gnu::always_inline]] inline void F(struct Meaning *v) { Meaning_lifetime_handler(HANDLE_DESTR, v, ((void *)0) ); } [[gnu::cleanup(F)]] struct Meaning d; Meaning_lifetime_handler(HANDLE_CREAT, & d, &initializer);; return 0; }