https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105734
--- Comment #10 from Jeremy R. <llvm at rifkin dot dev> --- One workaround in the general case is decltype(ns::expression_decomposer(ns::expression_decomposer{} << expr)) = libassert_decomposer = ns::expression_decomposer(ns::expression_decomposer{} << expr); But this doesn't work if expr is a lambda. A more general workaround is deferring the destructor to another function: template<typename T> void destruct(T& t) { t.~T(); } template <int> void bar() { auto m = hh::s(hh::s{}.h()); destruct(m); }