On 21/10/2021 13:42, Peter Dimov wrote:
begin/end don't have this problem in practice because you need to call both, and that's hard to do on the same temporary.
It's a constant thorn in Range's side, though, especially with all the various kinds of non-owning filters. But by the same token people should start getting more used to these sorts of considerations and be less prone to making such errors. And the static analysis tooling is a bit better now at spotting such things, though not perfect.
c_str does, but virtually nobody makes this mistake for some reason.
I recall some older (broken) C++ compiler (or rather: optimizer) implementations where the temporary in (rvalue).c_str() was sometimes destroyed after calling c_str() instead of after the entire full-expression, which caused all sorts of Fun™ for the common cases of passing this to a method call, which in turn led to defensively creating a lot of otherwise unnecessary lvalues. Thankfully modern compilers don't have that problem any more.