Позволяет спросить об этом простом области действия охранником:C++: другой один простой охранник сфера
template <class T>
struct finop_t {
T& t;
~finop_t() { t(); }
};
#define FINALLY__(l, cl) \
auto FIN ## l ## clo = cl; \
finop_t<decltype(FIN ## l ## clo)> FIN ## l ## fin { FIN ## l ## clo}
#define FINALLY_(l, cl) FINALLY__(l, cl)
#define FINALLY(...) FINALLY_(__LINE__, ([=](){__VA_ARGS__}))
int main() {
FINALLY(std::cout << "hello" << std::endl ;);
std::cout << "one" << std::endl;
FINALLY(std::cout << "world" << std::endl ;);
std::cout << "second" << std::endl;
return 0;
}
Безопасно ли полагаться на порядок уничтожения здесь? то есть безопасно ли считать, что ~finop_t()
будет вызываться до лямбда-деструктора?
ли это компилировать? Вы назначаете временную ссылку на изменяемое значение l-value. –
Он компилируется. Во-первых, я инициализирую переменную 'FIN ## l ## clo' со значением закрытия. (возможно, копия elision помогает здесь немного). Затем присвойте ссылку 'FIN ## l ## clo' в поле' t' переменной 'FIN ## l ## fin'. –
ах я вижу. в таком случае, почему бы не сохранить объект и не инициализировать его напрямую? Копирование elision не будет содержать избыточных копий, и вы не будете иметь косвенности через ссылку –