Perfect forwarding and c perfect forwarding
Perfect forwarding
#include <iostream>#include <string>#include <utility>using std::cout;using std::endl;using std::string;class Name{public: Name(const string & aName) :name{aName} { cout << "Lvalue Name constructor." << endl; } Name(string && aName) :name{ std::move(aName) } { cout << "Rvalue Name constructor." << endl; } const string & GetNmae()const { return name; }private: string name;};class Person{public: template<typename T1,typename T2> Person(T1 && first, T2 && second) :firstname{ std::forward<T1>(first) }, seondname{ std::forward<T2>(second) } { cout << "-------------------" << endl; } string getName()const { return firstname.GetNmae() + " " + seondname.GetNmae(); }private: Name firstname; Name seondname;};int main(){ Person me{ string{"Ivor"},string{"Horton"} }; cout << me.getName() << endl << endl; string first{"Fred"}; string second{"Fernackerpan"}; Person other{first,second}; cout << other.getName()<< endl << endl; Person brother{ first,string{"Bloggs"} }; cout << brother.getName() << endl << endl; Person another{"Richard","Horton"}; cout << another.getName() << endl;}
Output result:
Rvalue Name constructor.
Rvalue Name constructor.
-------------------
Ivor Horton
Lvalue Name constructor.
Lvalue Name constructor.
-------------------
Fred Fernackerpan
Lvalue Name constructor.
Rvalue Name constructor.
-------------------
Fred Bloggs
Rvalue Name constructor.
Rvalue Name constructor.
-------------------
Richard Horton