8.8 完美转发(2)
使用这些类的程序如下:
- // Ex8_11.cpp
- // Perfect forwarding
- #include <iostream>
- #include <utility>
- #include <string>
- using std::string;
- using std::cout;
- using std::endl;
- using std::forward;
- using std::move;
- // Put the Name class definition here...
- // Put the Person class definition here...
- int main()
- {
- cout << "Creating Person(string(\"Ivor\") , string(\"Horton\")) - rvalue arguments:"
- << endl;
- Person me(string("Ivor") , string("Horton"));
- cout << "Person is " << me.getName() << endl << endl;
- string first("Fred");
- string second("Fernackerpan");
- cout << "Creating Person(first , second) - lvalue arguments:" << endl;
- Person other(first,second);
- cout << "Person is " << other.getName() << endl << endl;
- cout << "Creating Person(first , string(\"Bloggs\")) - lvalue, rvalue arguments:"
- << endl;
- Person brother(first , string("Bloggs"));
- cout << "Person is " << brother.getName() << endl << endl;
- cout << "Creating Person(\"Richard\" , \"Horton\")) - rvalue const char* arguments:"
- << endl;
- Person another("Richard", "Horton");
- cout << "Person is " << another.getName() << endl << endl;
- return 0;
- }
这个例子的输出如下:
- Creating Person(string("Ivor") , string("Horton")) - rvalue arguments:
- Rvalue Name constructor.
- Rvalue Name constructor.
- Person is Ivor Horton
- Creating Person(first , second) - lvalue arguments:
- Lvalue Name constructor.
- Lvalue Name constructor.
- Person is Fred Fernackerpan
- Creating Person(first , string("Bloggs")) - lvalue, rvalue arguments:
- Lvalue Name constructor.
- Rvalue Name constructor.
- Person is Fred Bloggs
- Creating Person("Richard" , "Horton") - rvalue const char* arguments:
- Rvalue Name constructor.
- Rvalue Name constructor.
- Person is Richard Horton
示例说明
从输出结果可以看出,当Person构造函数的对应实参是一个lvalue引用时,就调用带lvalue引用形参的Name构造函数;当Person构造函数的实参是一个rvalue时,就调用带rvalue引用形参的Name构造函数。显然,std::forward()函数的工作方式与期望的相同。