[Development] qMoveToConst helper for rvalue references to movable Qt containers?

Giuseppe D'Angelo giuseppe.dangelo at kdab.com
Sun Oct 21 17:50:33 CEST 2018


Hello,

Il 21/10/18 16:15, Elvis Stansvik ha scritto:
> I couldn't find a way to contact them.

The best shot would be the std-discussion mailing list, I think.

> In order to try out the unsafe usage you suggested in your other mail,
> and also another unsafe usage pointed out in an SO question
> (https://stackoverflow.com/questions/39051460/why-does-as-const-forbid-rvalue-arguments/39051612#39051612),
> I made the following test program.
> 
> The output when running is:
> 
> [estan at newton move-to-const-test]$ ./move-to-const-test
> without moveToConst:
> FooPrivate constr from vector
> Foo constr with arg 0x7fffdb627200
> Foo begin 0x7fffdb627200
> Foo end 0x7fffdb627200
> Foo destr 0x7fffdb627200
> FooPrivate destr
> 
> with moveToConst:
> FooPrivate constr from vector
> Foo constr with arg 0x7fffdb627208
> Foo move constr 0x7fffdb627210
> Foo destr 0x7fffdb627208
> Foo begin const 0x7fffdb627210
> Foo end const 0x7fffdb627210
> Foo destr 0x7fffdb627210
> FooPrivate destr
> [estan at newton move-to-const-test]$
> 
> Which just shows it's working as intended.

However the third test should be a without moveToConst, but storing in a 
temporary, i.e. the current best practice. It should output exactly like 
the first one, but of course call const begin/end.

And note the extra move/destruciton in the second example.


> The two unsafe usages are commented out, because they wouldn't compile (good!).


Whops, you're absolutely right. My bad. With your proposed implementation:

> template <typename T>
> const T moveToConst(T &&t)
> {
>     return std::move(t);
> }

This won't compile when called on a non-const lvalue (the return type 
will be a lvalue reference to const, which won't bind to a non-const 
rvalue). I stand corrected.

Which actually makes me think of yet another possibility of misuse, that 
is, applying moveToConst to a function returning a const object. That 
will compile, using a copy...

> const QVector<Obj> getVector();
> for (auto &obj : moveToConst(getVector()) ~~~


Long story short, I think it's good if we stay away from this in Qt. 
Clazy warns you if you "do it wrong", and being a Qt-specific problem, 
we better not offer too many ways that could have unpleasant drawbacks.


My 2 c,
-- 
Giuseppe D'Angelo | giuseppe.dangelo at kdab.com | Senior Software Engineer
KDAB (France) S.A.S., a KDAB Group company
Tel. France +33 (0)4 90 84 08 53, http://www.kdab.com
KDAB - The Qt, C++ and OpenGL Experts

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4007 bytes
Desc: Firma crittografica S/MIME
URL: <http://lists.qt-project.org/pipermail/development/attachments/20181021/6c2d1c4c/attachment.bin>


More information about the Development mailing list