8.8 完美转发(3)
现在,在Person类中去掉加了注释符号的代码行中的注释符号,并给其上面的一行代码加上注释符号。现在构造函数的实参不再转发,其输出是:
- Creating Person(string("Ivor") , string("Horton")) - rvalue arguments:
- Lvalue Name constructor.
- Lvalue 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.
- Lvalue 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对象除外。如不使用完美转发,如何调用带rvalue引用形参的Name构造函数?答案是:字面量保持rvalue。如果允许把字面量实参表示为lvalue就可以修改它,这与字面量的定义相悖。
在Person类中为构造函数使用模板有一个重要的方面,它允许从两个实参中创建一个Person对象,这两个实参可以是临时的string对象、lvalue字符串对象,以空字符结尾的临时字符串,或以空字符结尾的lvalue字符串。为了提供这两个实参而不使用模板,需要编写16个类构造函数。而使用模板源代码会短得多,如果使用的构造函数实参组合少于16个,可执行的模块就较小。