where to type_std_move?

8

Click here to load reader

Upload: andrey-upadyshev

Post on 12-Apr-2017

797 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Where to type_std_move?

Wheretotypestd::move?AndreyUpadyshev

LicensedunderaCCBY-SA4.0License. Version2016-04-26-1

Page 2: Where to type_std_move?

TheProblemvoid foo(Object && object){

// Should we apply std::move// to the object member?consume( std::move(object.member) );

// or to the object itself?consume( std::move(object).member );

}

Notethatit’sallrelatedtostd::forward aswell.

Page 3: Where to type_std_move?

Whattheheck,isthereadifference?

Itis.Sometimes.std::move(object.member)• Means:castaresultoftheobjectmemberaccesstoa[cv-qualified] rvalue.• Theresultisalways anrvalue.

std::move(object).member• Means:casttheobjecttoa[cv-qualified] rvalue thenaccessitsmember.• Ifmemberisneitherastaticmembernorareferencetheresultisanrvalue.• Otherwise theresultislvalue.

Page 4: Where to type_std_move?

WhyshouldIcare?std::move(object.member) canaccidentallymovefromasharedobjectifappliedtoareferenceorastaticmember:

class Object {Member& member;…

};

...std::move(object.member)

std::move(object).member neverdoesso.

Thinkaboutgenericcodeorchangingamembertypeasaresultofrefactoring.

Page 5: Where to type_std_move?

Genericcodeexample

Somewhereintheheartofthegenericcode:consume(std::move(std::get<i>(tuple))...);

Noidea,what’sinthetuple.Itcanbeavalueorareference.Whenaccidentalmovefromasharedobjectishappeneditwillbeadisaster.

Thisapproachissafe(oratleastsafer):consume(std::get<i>(std::move(tuple))...);

Page 6: Where to type_std_move?

Sometimesitmaybereallydifferent

Slicefromatuple.Memberthatarervalues aremoved:auto tuple = hana::make_tuple("abc"s, "def"s,

"ghi"s, "jkl"s);consume(hana::slice_c<0, 2>(std::move(tuple)));consume(hana::slice_c<2, 4>(std::move(tuple)));

Applyingstd::move atthelaststepisuseless,membersarealreadycopiedinsideslice:

consume(std::move(hana::slice_c<0, 2>(tuple))); // copy

Anotherexamplewherebehaviormaydifferisref-qualifiedmethods.

Page 7: Where to type_std_move?

Wheretotypewhat?

• std::move(object.member) tounconditionallymovefromamember.• std::move(object).member totellthattheobjectisactuallyanrvalue thenonlythesafethingscanhappenJ

Page 8: Where to type_std_move?

Links

1. AndreyUpadyshev,What'sthedifferencebetweenstd::move(object.member)andstd::move(object).member?http://oliora.github.io/2016/02/12/where-to-put-std-move.html

2. LouisDionne,Atentativenotionofmove-independencehttp://ldionne.com/2016/02/17/a-tentative-notion-of-move-independence/

3. Reddit threadhttps://www.reddit.com/r/cpp/comments/45w3fs/whats_the_difference_between_stdmoveobjectmember/

4. TheC++Standard:ClassMemberAccess [expr.ref-4]http://eel.is/c++draft/expr.ref#4