ccotter added a comment.

  > If you add std::move you will get compilation error, if you add 
std::forward, everything will work fine. Simply Value& and && will evaluate to 
Value&, no rvalue reference here.

I agree that examining the template definition alone is not correct. In your 
original example with `SomeClass`, `T` is not a forwarding reference since `T` 
is not deduced in the constructor, so it's misleading to use `forward` in this 
context. `forward` "works" and leads to the behavior you are likely seeking in 
your `SomeClass` example, but not in the usual way the most readers would 
expect (the spirit of the CppCoreGuidelines is to provide certain restricted 
ideas as recommendations, and using `forward` in this way violates ES.56: "Flag 
when std::forward is applied to other than a forwarding reference."). Usually, 
I'd expect to see a class template on a type to have different specializations 
for `T` being a non-reference and another for `T` being a reference (e.g., 
`std::future`), or only allow `T` to be a reference or non-reference (e.g., 
`std::optional`), but not both.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D141569/new/

https://reviews.llvm.org/D141569

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to