[Development] QVector now has rvalue push_back (was: Re: HEADS UP: potential trouble from a recent QVector change)
Gunnar Roth
gunnar.roth at gmx.de
Tue Jul 21 20:28:31 CEST 2015
> Am 21.07.2015 um 20:11 schrieb Bubke Marco <Marco.Bubke at theqtcompany.com>:
>
>
> Gunnar Roth <gunnar.roth at gmx.de>
>>>
>>> void push_back(T &&t) {
>>> ensureCapacity(size() + 1);
>>> new (m_end) T(std::move(t)); // move-construct from t
>>> ++m_end;
>> why is std::move needed here? Afaik std::move(t) converts t into a rvalue ref, but t is already an r-value ref.
>
> If T would be not a template t is binding to a rvalue reference but it is not itself a rvalue reference but an lvalue.
> If T is a template like in this case it is more complicated because it is a universal or forward reference. For a
> forward reference it could be an lvalue reference like (T&) or a lvalue(T) depending as the argument is a rvalue,
> lvalue or lvalue reference.
> T&& -> T
> T& -> T&
> T -> T
>
> std::forward would be of better use than std::move:
> http://en.cppreference.com/w/cpp/utility/forward
>
Well std::forward is the right thing to do here not std::move ( std::move just does accidentally the same. the forward is needed because of the way T is deduced from the passed parameter.
Regards,
Gunnar Roth
More information about the Development
mailing list