WEB开发网
开发学院软件开发VC VC10中的C++0x特性 Part 2 (3):右值引用 阅读

VC10中的C++0x特性 Part 2 (3):右值引用

 2009-06-10 20:07:36 来源:WEB开发网   
核心提示: 这里藉由 Name 的显式规格说明来打印出类型,当我们调用 quark(up) 时,VC10中的C++0x特性 Part 2 (3):右值引用(4),会进行模板参数推导, quark() 是一个带有模板参数 T 的模板函数, 因此 T&& 是 const string&& ,但 quark

这里藉由 Name 的显式规格说明来打印出类型。

当我们调用 quark(up) 时,会进行模板参数推导。 quark() 是一个带有模板参数 T 的模板函数,但是我们还没有为它提供显式的类型参数(比如像 quark<X>(up)这样的)。通过比较函数形参类型 Type&& 和函数实参类型(一个 string 类型的 lvalue)我们就能推导出模板实参类型。(译注:原文用 argument 表示实参,parameter 表示形参)

C++0x 会转换函数实参的类型和形参的类型,然后再进行匹配。

首先,转换函数实参的类型。这遵循一条特殊规则(提案N2798

然后,转换函数形参的类型。不管是 C++98/03 还是 C++0x 都会解除引用( lvalue 引用和 rvalue 引用在 C++0x 中都会被解除掉)。在前面例子的四种情形中,这样我们会把 T&& 转换成 T 。

于是, T 会被推导成函数实参转换之后的类型。up 和 down 都是 lvalue,它们遵循那条特殊规则,这就是为什么 quark(up)  打印出"T:string&" ,而 quark(down) 打印出 "T: cosnt string&"的原因。strange() 和 charm() 都是右值,它们遵循一般规则,这就是为什么 quark(strange()) 打印出 "T: string" 而 quark(charm()) 打印出"T: const string" 的原因。

替换操作会在类型推导之后进行。模板形参 T 出现的每一个地方都会被替换成推导出来的模板实参类型。在 quark(string()) 中 T 是 string ,因此 T&& 会是 string&& 。同样,在 quark(charm()) 中,T 是 const string , 因此 T&& 是 const string&& 。但 quark(up) 和 quark(down) 不同,它们遵循另外的特殊规则。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:VC 特性 Part

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接