完美转发
#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; }
输出结果:
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