8.8 完美转发(3)

2013-10-07 16:08:48 · 作者: · 浏览: 59

8.8  完美转发(3)

现在,在Person类中去掉加了注释符号的代码行中的注释符号,并给其上面的一行代码加上注释符号。现在构造函数的实参不再转发,其输出是:

  1. Creating Person(string("Ivor") , string("Horton")) - rvalue arguments:  
  2. Lvalue Name constructor.  
  3. Lvalue Name constructor.  
  4. Person is Ivor Horton  
  5. Creating Person(first , second) - lvalue arguments:  
  6. Lvalue Name constructor.  
  7. Lvalue Name constructor.  
  8. Person is Fred Fernackerpan  
  9. Creating Person(first , string("Bloggs")) - lvalue, rvalue arguments:  
  10. Lvalue Name constructor.  
  11. Lvalue Name constructor.  
  12. Person is Fred Bloggs  
  13. Creating Person("Richard" , "Horton") - rvalue const char* arguments:  
  14. Rvalue Name constructor.  
  15. Rvalue Name constructor.  
  16. Person is Richard Horton  

这与没有应用完美转发功能的情况相一致,但最后一个Person对象除外。如不使用完美转发,如何调用带rvalue引用形参的Name构造函数?答案是:字面量保持rvalue。如果允许把字面量实参表示为lvalue就可以修改它,这与字面量的定义相悖。

在Person类中为构造函数使用模板有一个重要的方面,它允许从两个实参中创建一个Person对象,这两个实参可以是临时的string对象、lvalue字符串对象,以空字符结尾的临时字符串,或以空字符结尾的lvalue字符串。为了提供这两个实参而不使用模板,需要编写16个类构造函数。而使用模板源代码会短得多,如果使用的构造函数实参组合少于16个,可执行的模块就较小。