您的位置:首页 > 其它

模板实参推断与引用

2016-10-16 14:52 190 查看
1从左值引用函数参数推断类型

template<typename T>void f1(T&);当一个函数参数是模板类型参数的一个普通引用时,绑定规则告诉我们,只能传递给他一个左值(如:一个变量或一个返回引用类型的表达式)。实参可以是const类型,也可以不是。如果实参是const,者T被推断为const类型。

template<typename T>void f2(const T&);如果一个函数参数的类型是const T&;正常的规则告诉我们可以传递给他任何类型的实参-------一个对象(const或非const),一个临时对象或是一个字面值常量。单函数参数本身是const,T的类型推断结构不会是一个const类型。const已经是函数参数类型的一部分;因此,他不会也是模板参数类型的一部分。

2从右值引用函数参数推断类型

template<typename T>void f3(T&& );当一个函数参数是一个右值引用时,正常的绑定规则告诉我们可以传递给它一个右值。当我们这样做时,类型推断过程类似左值引用函数参数的推断过程。推断出的T的类型是该右值实参的类型;

3引用折叠和右值应用参数

       a 我们能将一个左值传递给函数的右值引用参数,且此右值引用指向模板类型参数时,编译器推断模板类型参数为实参的左值引用类型。

       b 如果我们简介创建一个引用的引用,则这些引用形成折叠:X& & ,  X&  && ,  X && &都折叠成类型X&;X&& &&折叠成X&&

如果将引用折叠规则和右值引用的特殊类型推断规则组合在一起,则意味着我们可以对一个左值调用f3,编译器推断T为左值引用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: