I have previously worked a lot with expression templates, and using them together with auto is a pain - errors crop up all the time, and I ended up wrapping most of the functionality away.
So instead, I would propose adding a new attribute [[temporary_type]] that tells the compiler to emit a warning when an object of the type is used in a non-temporary context. I am not too certain on value categories, but I think it would work well if this would just mean a warning when the object is an lvalue. The user then knows to call some function, or to use a cast or an explicit type for the assignment, whatever works in the context of the library.
An accompanying attribute could be [[allowed_temporary_lvalue]], to suppress the warning at the call site. This would allow using the type warning-free within the library where it is created, and clearly express that this is a special case, not the primary use case for this type.
While I find P0672R0 interesting, I also think it may be overkill for a relatively niche problem. I ran into it using armadillo (linear algebra), the Wikipedia site specifies mostly linear algebra as a use case, and a quick google search ends up with the same thing. So on a value-effort graph, I think P0672R0 has to much effort for too little value. Attributes do not change the core language significantly, do not introduce new syntax or complexities, they simply tell compilers to emit warnings under certain conditions. That seems like a much cheaper way of getting some safety into the use of expression templates. It does not allow the drop-in replacement of expression templates, but I consider that a somewhat minor problem compared to the bugs that crop up when using them in an auto-riddled, modern-C++ world.
I am not an expert on the standard, so I would love some comments on this.