Change const T&&
parameters to T&&
to enable proper move semantics
#29464
+6
−6
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Replace
const T&&
parameters with correctT&&
(non-const rvalue references) so thatmove()
semantics actually take effect.Problem
const T&&
disables movesMove constructors/operators are declared as
widget(T&&)
/widget& operator=(T&&)
. When a parameter isconst T&&
, the argument becomes an immutable rvalue, so the move constructor cannot be called, only the copy constructor is viable.std::move()
is pointless onconst
rvaluesstd::move
merely casts to exactly the same reference type it receives; if the variable is const, the result is stillconst T&&
.Unnecessary copies & misleading code
Large objects are copied instead of moved, wasting memory/CPU and hiding the real cost from programmers.
Fix
Drop the
const
qualifier on all rvalue-reference parameters:Impact
References
std::move
on aconst
object?