[PATCH] D99005: [clang] Implement P2266 Simpler implicit move
Arthur O'Dwyer via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jun 15 09:09:26 PDT 2021
Quuxplusone added a comment.
@sberg: Thanks for the example! @mizvekov's comments are correct, but I wanted to put some more comments here for posterity. (I'll also try to find a place for this real-world example in the next revision of p2266 <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2266r1.html>.)
The code in question is `o3tl::temporary`, documented as "Cast an rvalue to an lvalue." and implemented as `template<class T> T& temporary(T&& x) { return x; }`
https://docs.libreoffice.org/o3tl/html/temporary_8hxx_source.html
p2266 proposes to break this code in C++23, by making the expression `x` an xvalue. EWG was well aware that p2266 would break this exact kind of "laundering" function, which takes an rvalue and launders it into an lvalue without a cast. This breakage was generally (though I'm sure not universally) seen as a good thing. We weren't aware of any specific real-world examples of such "laundering" functions, though, so this is very useful info.
As Matheus says, the best way to fix the code is to add an explicit cast: `return static_cast<T&>(x);`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99005/new/
https://reviews.llvm.org/D99005
More information about the cfe-commits
mailing list