[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