#include #include struct X { int i; X(int i) : i{ i} { std::cout << "+X " << i << "\n"; } X(X const& that) : i{that.i} { std::cout << "copy X " << i << "\n"; } X(X && that) : i{that.i} { std::cout << "move X " << i << "\n"; } }; copy_from: (copy _) = { } use: (_) = {} // invoking each of these with an rvalue std::pair argument ... apply_implicit_forward: (forward t: std::pair) = { copy_from(t.first); // copies copy_from(t.second); // moves } apply_explicit_forward: (forward t: std::pair) = { copy_from(forward t.first); // moves copy_from(forward t.second); // moves } main: ()->int = { t1: std::pair = (1,2); apply_implicit_forward(t1); use(t1); apply_implicit_forward(t1); t2: std::pair = (3,4); apply_explicit_forward(t2); use(t2); apply_explicit_forward(t2); }