#include <iostream> #include <string> class T { public: T(const std::string& name): name_(name), copy_(0), move_(0){} T(const T& rhs) : name_(rhs.name_), copy_(rhs.copy_), move_(rhs.move_) { copy_++; } T(T&& rhs) : name_(rhs.name_), copy_(rhs.copy_), move_(rhs.move_) { swap(rhs); move_++; } void swap(T& rhs) { std::swap(name_, rhs.name_); std::swap(copy_, rhs.copy_); std::swap(move_, rhs.move_); } void op() { std::cout << name_ << "-copy: " << copy_ << ", move: " << move_ << std::endl; } private: int copy_; int move_; std::string name_; }; T op1(const T& val) // pass by const reference { std::cout << "op1" << std::endl; T tmp(val); //copy ctor tmp.op(); return tmp; } T op2(T val) // pass by value { std::cout << "op2" << std::endl; val.op(); return val; } T op3(T&& val) // pass by rvalue reference { std::cout << "op3" << std::endl; val.op(); return val; } T op4(const T& val) // pass by const lvalue reference { std::cout << "op4 [A]" << std::endl; T tmp(val); tmp.op(); return tmp; } T op4(T&& val) // pass by rvalue reference { std::cout << "op4 [B]" << std::endl; val.op(); return val; } T op5(const T& val) // pass by const lvalue reference { std::cout << "op5 [A]" << std::endl; T tmp(val); tmp.op(); return tmp; } T op5(T&& val) // pass by rvalue reference { std::cout << "op5 [B]" << std::endl; val.op(); return std::move(val); } int main( int argc, char* argv[] ) { T t("lvalue"); op1(t).op(); T t1("xvalue"); op1(std::move(t1)).op(); op1(T("rvalue")).op(); op2(t).op(); T t2("xvalue"); op2(std::move(t2)).op(); op2(T("rvalue")).op(); //op3(t).op(); //error T t3("xvalue"); op3(std::move(t3)).op(); op3(T("rvalue")).op(); op4(t).op(); T t4("xvalue"); op4(std::move(t4)).op(); op4(T("rvalue")).op(); op5(t).op(); T t5("xvalue"); op5(std::move(t5)).op(); op5(T("rvalue")).op(); return 0; }
Standard input is empty
op1 lvalue-copy: 1, move: 0 lvalue-copy: 1, move: 0 op1 xvalue-copy: 1, move: 0 xvalue-copy: 1, move: 0 op1 rvalue-copy: 1, move: 0 rvalue-copy: 1, move: 0 op2 lvalue-copy: 1, move: 0 lvalue-copy: 2, move: 0 op2 xvalue-copy: 0, move: 1 xvalue-copy: 1, move: 1 op2 rvalue-copy: 0, move: 0 rvalue-copy: 1, move: 0 op3 xvalue-copy: 0, move: 0 xvalue-copy: 1, move: 0 op3 rvalue-copy: 0, move: 0 rvalue-copy: 1, move: 0 op4 [A] lvalue-copy: 1, move: 0 lvalue-copy: 1, move: 0 op4 [B] xvalue-copy: 0, move: 0 xvalue-copy: 1, move: 0 op4 [B] rvalue-copy: 0, move: 0 rvalue-copy: 1, move: 0 op5 [A] lvalue-copy: 1, move: 0 lvalue-copy: 1, move: 0 op5 [B] xvalue-copy: 0, move: 0 xvalue-copy: 0, move: 1 op5 [B] rvalue-copy: 0, move: 0 rvalue-copy: 0, move: 1