verständnisproblem std::move / move-konstruktor
-
hallo,
im folgenden snippet:
#include <utility> struct A{}; struct B { A a; A const& get_a() const & noexcept { return a; } A& get_a() & noexcept { return a; } A&& get_a() && noexcept { return std::move( a ); } B() noexcept = default; // Variante 1 B(B&& rhs) : a( std::move( rhs.get_a() ) ) {} // Variante 2 B(B&& rhs) : a( std::move( rhs ).get_a() ) {} }; int main() { B a, b{ std::move( a ) }; }
welche der beiden varianten der move-konstruktor-implementationen ist idiomatischer? mir ist bewusst, dass die explizite definition hier unnötigt ist; das ist nur ein beispiel.
ausserdem: wenn ich
B&& rhs
als funktionsparameter stehen habe, was ist dann der typ vonrhs
? wenn erB&&
wäre, dann gäbe es doch keinen grund,std::move
zu benutzen, oder?LG
-
move your booty schrieb:
welche der beiden varianten der move-konstruktor-implementationen ist idiomatischer?
Idiomatischer? Was auch immer das heißen mag:
B(B&& rhs) : a( std::move( rhs.a ) ) {}
move your booty schrieb:
ausserdem: wenn ich
B&& rhs
als funktionsparameter stehen habe, was ist dann der typ vonrhs
?Wenn es einen Namen hat ist es keine rvalue Referenz.
-
move your booty schrieb:
ausserdem: wenn ich
B&& rhs
als funktionsparameter stehen habe, was ist dann der typ vonrhs
?Der Typ der Entität namens
rhs
istB&&
, und das ist auch, wasdecltype(rhs)
dir geben wird. Allerdings ist der Ausdruckrhs
ein lvalue vom TypB
(wasdecltype((rhs))
dir bestätigt, weil esB&
sein wird). Was das heißt, ist, dass von dem Ausdruckrhs
nicht gemoved wird. Du musst den Namen schon zu einem rvalue casten (wasmove
idiomatisch für dich erledigt).